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; 225ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onukiimport android.annotation.TestApi; 234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.ComponentName; 244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Context; 254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Intent; 26772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guyimport android.content.pm.PackageManager.ApplicationInfoFlags; 274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.graphics.Rect; 284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Bundle; 29b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Handler; 30b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Looper; 31b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Message; 326f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.os.ParcelFileDescriptor; 334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteException; 345ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onukiimport android.os.ServiceManager; 354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserHandle; 36e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasaniimport android.os.UserManager; 374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Log; 384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 396f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport java.lang.annotation.Retention; 406f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport java.lang.annotation.RetentionPolicy; 414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList; 42b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onukiimport java.util.Arrays; 434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.Collections; 444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List; 454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/** 474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Class for retrieving a list of launchable activities for the current user and any associated 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * managed profiles. This is mainly for use by launchers. Apps can be queried for each user profile. 494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Since the PackageManager will not deliver package broadcasts for other profiles, you can register 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * for package changes here. 51e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * <p> 52e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * To watch for managed profiles being added or removed, register for the following broadcasts: 53e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * {@link Intent#ACTION_MANAGED_PROFILE_ADDED} and {@link Intent#ACTION_MANAGED_PROFILE_REMOVED}. 54e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * <p> 55e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * You can retrieve the list of profiles associated with this user with 56e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * {@link UserManager#getUserProfiles()}. 574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherApps { 594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani static final String TAG = "LauncherApps"; 614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani static final boolean DEBUG = false; 624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private Context mContext; 644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private ILauncherApps mService; 65e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani private PackageManager mPm; 664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 67b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private List<CallbackMessageHandler> mCallbacks 68b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy = new ArrayList<CallbackMessageHandler>(); 69c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 70c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 71c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Callbacks for package changes to this and related managed profiles. 72c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 73f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public static abstract class Callback { 74c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 75c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Indicates that a package was removed from the specified profile. 76c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 77b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * If a package is removed while being updated onPackageChanged will be 78b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * called instead. 79b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * 80c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param packageName The name of the package that was removed. 81c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param user The UserHandle of the profile that generated the change. 82c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 83c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy abstract public void onPackageRemoved(String packageName, UserHandle user); 84c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 85c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 86c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Indicates that a package was added to the specified profile. 87c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 88b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * If a package is added while being updated then onPackageChanged will be 89b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * called instead. 90b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * 91c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param packageName The name of the package that was added. 92c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param user The UserHandle of the profile that generated the change. 93c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 94c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy abstract public void onPackageAdded(String packageName, UserHandle user); 95c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 96c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 97c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Indicates that a package was modified in the specified profile. 98b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * This can happen, for example, when the package is updated or when 99b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * one or more components are enabled or disabled. 100c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 101c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param packageName The name of the package that has changed. 102c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param user The UserHandle of the profile that generated the change. 103c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 104c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy abstract public void onPackageChanged(String packageName, UserHandle user); 105c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 106c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 107c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Indicates that one or more packages have become available. For 108c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * example, this can happen when a removable storage card has 109c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * reappeared. 110c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 111c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param packageNames The names of the packages that have become 112c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * available. 113c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param user The UserHandle of the profile that generated the change. 114c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param replacing Indicates whether these packages are replacing 115c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * existing ones. 116c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 117c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy abstract public void onPackagesAvailable(String[] packageNames, UserHandle user, 118c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy boolean replacing); 119c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 120c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 121c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * Indicates that one or more packages have become unavailable. For 122c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * example, this can happen when a removable storage card has been 123c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * removed. 124c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 125c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param packageNames The names of the packages that have become 126c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * unavailable. 127c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param user The UserHandle of the profile that generated the change. 128c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * @param replacing Indicates whether the packages are about to be 129c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * replaced with new versions. 130c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 131c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy abstract public void onPackagesUnavailable(String[] packageNames, UserHandle user, 132c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy boolean replacing); 133772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 134772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy /** 135772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * Indicates that one or more packages have been suspended. For 136772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * example, this can happen when a Device Administrator suspends 137772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * an applicaton. 138772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * 139772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param packageNames The names of the packages that have just been 140772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * suspended. 141772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param user The UserHandle of the profile that generated the change. 142772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy */ 143772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void onPackagesSuspended(String[] packageNames, UserHandle user) { 144772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 145772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 146772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy /** 147772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * Indicates that one or more packages have been unsuspended. For 148772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * example, this can happen when a Device Administrator unsuspends 149772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * an applicaton. 150772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * 151772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param packageNames The names of the packages that have just been 152772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * unsuspended. 153772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param user The UserHandle of the profile that generated the change. 154772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy */ 155772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { 156772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 1576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 1586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 1596f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Indicates that one or more shortcuts (which may be dynamic and/or pinned) 1606f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * have been added, updated or removed. 1616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 1622d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Only the applications that are allowed to access the shortcut information, 1632d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * as defined in {@link #hasShortcutHostPermission()}, will receive it. 1642d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * 1656f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param packageName The name of the package that has the shortcuts. 166aa8b94aa79df94d77d0f7698ce532ac98f197a99Makoto Onuki * @param shortcuts all shortcuts from the package (dynamic and/or pinned). Only "key" 167aa8b94aa79df94d77d0f7698ce532ac98f197a99Makoto Onuki * information will be provided, as defined in {@link ShortcutInfo#hasKeyFieldsOnly()}. 1686f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param user The UserHandle of the profile that generated the change. 169538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 170538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 1716f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 1726f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void onShortcutsChanged(@NonNull String packageName, 1736f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) { 1746f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 1756f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 1766f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 1776f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 1786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Represents a query passed to {@link #getShortcuts(ShortcutQuery, UserHandle)}. 179538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 180538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 1816f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 1826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public static class ShortcutQuery { 1836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 1846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Include dynamic shortcuts in the result. 1856f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 1866f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public static final int FLAG_GET_DYNAMIC = 1 << 0; 1876f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 1886f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 1896f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Include pinned shortcuts in the result. 1906f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 1916f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public static final int FLAG_GET_PINNED = 1 << 1; 1926f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 1936f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 1945504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki * Requests "key" fields only. See {@link ShortcutInfo#hasKeyFieldsOnly()} for which 1955504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki * fields are available. 1966f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 1976f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public static final int FLAG_GET_KEY_FIELDS_ONLY = 1 << 2; 1986f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 1996f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** @hide */ 2006f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @IntDef(flag = true, 2016f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki value = { 2026f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki FLAG_GET_DYNAMIC, 2036f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki FLAG_GET_PINNED, 2046f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki FLAG_GET_KEY_FIELDS_ONLY, 2056f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki }) 2066f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Retention(RetentionPolicy.SOURCE) 2076f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public @interface QueryFlags {} 2086f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2096f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki long mChangedSince; 2106f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2116f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Nullable 2126f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki String mPackage; 2136f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2146f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Nullable 215abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki List<String> mShortcutIds; 216abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 217abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @Nullable 2186f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki ComponentName mActivity; 2196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @QueryFlags 2216f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki int mQueryFlags; 2226f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2236f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public ShortcutQuery() { 2246f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 2256f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2266f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 2276f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * If non-zero, returns only shortcuts that have been added or updated since the timestamp, 2286f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * which is a milliseconds since the Epoch. 2296f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 2306f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void setChangedSince(long changedSince) { 2316f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mChangedSince = changedSince; 2326f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 2336f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2346f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 2356f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * If non-null, returns only shortcuts from the package. 2366f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 2376f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void setPackage(@Nullable String packageName) { 2386f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mPackage = packageName; 2396f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 2406f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2416f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 242abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * If non-null, return only the specified shortcuts by ID. When setting this field, 243abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * a packange name must also be set with {@link #setPackage}. 244abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki */ 245abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki public void setShortcutIds(@Nullable List<String> shortcutIds) { 246abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki mShortcutIds = shortcutIds; 247abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 248abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 249abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki /** 2506f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * If non-null, returns only shortcuts associated with the activity. 2516f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 2526f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void setActivity(@Nullable ComponentName activity) { 2536f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mActivity = activity; 2546f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 2556f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 2566f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 2576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Set query options. 2586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 2596f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void setQueryFlags(@QueryFlags int queryFlags) { 2606f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mQueryFlags = queryFlags; 2616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 262c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 2634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** @hide */ 2654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherApps(Context context, ILauncherApps service) { 2664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext = context; 2674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService = service; 268e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani mPm = context.getPackageManager(); 2694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2715ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki /** @hide */ 2725ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki @TestApi 2735ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki public LauncherApps(Context context) { 2745ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki this(context, ILauncherApps.Stub.asInterface( 2755ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki ServiceManager.getService(Context.LAUNCHER_APPS_SERVICE))); 2765ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki } 2775ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki 2784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 2794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Retrieves a list of launchable activities that match {@link Intent#ACTION_MAIN} and 2804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * {@link Intent#CATEGORY_LAUNCHER}, for a specified user. 2814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 2824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageName The specific package to query. If null, it checks all installed packages 2834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * in the profile. 2844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile. 2854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @return List of launchable activities. Can be an empty list but will not be null. 2864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 2874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) { 2886cbc2fec91c8eae62b0ed578523af4f9765f9c17Sunny Goyal ParceledListSlice<ResolveInfo> activities = null; 2894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani activities = mService.getLauncherActivities(packageName, user); 2914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 292f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 2934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (activities == null) { 2954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return Collections.EMPTY_LIST; 2964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ArrayList<LauncherActivityInfo> lais = new ArrayList<LauncherActivityInfo>(); 2986cbc2fec91c8eae62b0ed578523af4f9765f9c17Sunny Goyal for (ResolveInfo ri : activities.getList()) { 29945d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal LauncherActivityInfo lai = new LauncherActivityInfo(mContext, ri.activityInfo, user); 3004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 3014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.v(TAG, "Returning activity for profile " + user + " : " 3024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani + lai.getComponentName()); 3034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani lais.add(lai); 3054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return lais; 3074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 3104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Returns the activity info for a given intent and user handle, if it resolves. Otherwise it 3114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * returns null. 3124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 3134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param intent The intent to find a match for. 3144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The profile to look in for a match. 3154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @return An activity info object if there is a match. 3164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 3174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) { 3184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 31945d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal ActivityInfo ai = mService.resolveActivity(intent.getComponent(), user); 32045d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal if (ai != null) { 32145d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal LauncherActivityInfo info = new LauncherActivityInfo(mContext, ai, user); 3224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return info; 3234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 325f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 3264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return null; 3284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 331f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy * Starts a Main activity in the specified profile. 3324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 3334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param component The ComponentName of the activity to launch 334e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * @param user The UserHandle of the profile 335e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * @param sourceBounds The Rect containing the source bounds of the clicked icon 336e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * @param opts Options to pass to startActivity 337e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani */ 338f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public void startMainActivity(ComponentName component, UserHandle user, Rect sourceBounds, 339e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani Bundle opts) { 3405abdbb656063160ff8df2306bd01feba0714d4c1Amith Yamasani if (DEBUG) { 341f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy Log.i(TAG, "StartMainActivity " + component + " " + user.getIdentifier()); 3425abdbb656063160ff8df2306bd01feba0714d4c1Amith Yamasani } 3434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService.startActivityAsUser(component, sourceBounds, opts, user); 3454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 346f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 3474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 351466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * Starts the settings activity to show the application details for a 352466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * package in the specified profile. 353466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * 354466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * @param component The ComponentName of the package to launch settings for. 355466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * @param user The UserHandle of the profile 356466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * @param sourceBounds The Rect containing the source bounds of the clicked icon 357466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy * @param opts Options to pass to startActivity 358466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy */ 359f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public void startAppDetailsActivity(ComponentName component, UserHandle user, 360466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy Rect sourceBounds, Bundle opts) { 361466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy try { 362466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy mService.showAppDetailsAsUser(component, sourceBounds, opts, user); 363466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy } catch (RemoteException re) { 364f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 365466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy } 366466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy } 367466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy 368466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy /** 36953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * Checks if the package is installed and enabled for a profile. 37053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * 37153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @param packageName The package to check. 37253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @param user The UserHandle of the profile. 37353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * 37453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @return true if the package exists and is enabled. 37553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy */ 376f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public boolean isPackageEnabled(String packageName, UserHandle user) { 37753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 37853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return mService.isPackageEnabled(packageName, user); 37953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } catch (RemoteException re) { 380f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 38153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 38253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 38353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 38453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy /** 385772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * Retrieve all of the information we know about a particular package / application. 386772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * 387772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param packageName The package of the application 388772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param flags Additional option flags {@link PackageManager#getApplicationInfo} 389772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @param user The UserHandle of the profile. 390772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * 391772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * @return An {@link ApplicationInfo} containing information about the package or 392772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy * null of the package isn't found. 39345d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal * @hide 394772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy */ 395772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public ApplicationInfo getApplicationInfo(String packageName, @ApplicationInfoFlags int flags, 396772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy UserHandle user) { 397772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy try { 398772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy return mService.getApplicationInfo(packageName, flags, user); 399772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } catch (RemoteException re) { 400f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 401772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 402772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 403772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 404772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy /** 40553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * Checks if the activity exists and it enabled for a profile. 40653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * 40753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @param component The activity to check. 40853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @param user The UserHandle of the profile. 40953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * 41053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy * @return true if the activity exists and is enabled. 41153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy */ 412f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public boolean isActivityEnabled(ComponentName component, UserHandle user) { 41353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 41453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return mService.isActivityEnabled(component, user); 41553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } catch (RemoteException re) { 416f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 41753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 41853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 41953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 4206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 4212d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * Returns whether the caller can access the shortcut information. 4222d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * 4232d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Only the default launcher can access the shortcut information. 4242d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * 4252d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Note when this method returns {@code false}, that may be a temporary situation because 4262d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * the user is trying a new launcher application. The user may decide to change the default 4272d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * launcher to the calling application again, so even if a launcher application loses 4282d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * this permission, it does <b>not</b> have to purge pinned shortcut information. 429538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 430538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 4312d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki */ 4322d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki public boolean hasShortcutHostPermission() { 4332d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki try { 4342d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki return mService.hasShortcutHostPermission(mContext.getPackageName()); 4352d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki } catch (RemoteException re) { 4362d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki throw re.rethrowFromSystemServer(); 4372d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki } 4382d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki } 4392d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki 4402d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki /** 4416f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Returns the IDs of {@link ShortcutInfo}s that match {@code query}. 4426f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4432d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 4442d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * #hasShortcutHostPermission()}. 4456f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4466f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param query result includes shortcuts matching this query. 4476f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param user The UserHandle of the profile. 4486f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4496f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @return the IDs of {@link ShortcutInfo}s that match the query. 450538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 451538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 4526f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 4536f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Nullable 4546f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public List<ShortcutInfo> getShortcuts(@NonNull ShortcutQuery query, 4556f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @NonNull UserHandle user) { 4566f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki try { 4576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki return mService.getShortcuts(mContext.getPackageName(), 458abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki query.mChangedSince, query.mPackage, query.mShortcutIds, query.mActivity, 459abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki query.mQueryFlags, user) 4606f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki .getList(); 4616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } catch (RemoteException e) { 4626f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki throw e.rethrowFromSystemServer(); 4636f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 4646f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 4656f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 4666f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 467abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @hide // No longer used. Use getShortcuts() instead. Kept for unit tests. 4686f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 4696f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Nullable 4706f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public List<ShortcutInfo> getShortcutInfo(@NonNull String packageName, 4716f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @NonNull List<String> ids, @NonNull UserHandle user) { 472abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki final ShortcutQuery q = new ShortcutQuery(); 473abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki q.setPackage(packageName); 474abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki q.setShortcutIds(ids); 475abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki q.setQueryFlags(ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED); 476abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return getShortcuts(q, user); 4776f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 4786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 4796f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 4806f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Pin shortcuts on a package. 4816f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * <p>This API is <b>NOT</b> cumulative; this will replace all pinned shortcuts for the package. 4836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * However, different launchers may have different set of pinned shortcuts. 4846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4852d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 4862d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * #hasShortcutHostPermission()}. 4876f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 4886f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param packageName The target package name. 4896f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param shortcutIds The IDs of the shortcut to be pinned. 4906f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param user The UserHandle of the profile. 491538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 492538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 4936f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 4946f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void pinShortcuts(@NonNull String packageName, @NonNull List<String> shortcutIds, 4956f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @NonNull UserHandle user) { 4966f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki try { 4976f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mService.pinShortcuts(mContext.getPackageName(), packageName, shortcutIds, user); 4986f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } catch (RemoteException e) { 4996f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki throw e.rethrowFromSystemServer(); 5006f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 5016f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 5026f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 5036f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 504b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki * @hide kept for testing. 505abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki */ 506abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki public int getShortcutIconResId(@NonNull ShortcutInfo shortcut) { 507b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki return shortcut.getIconResourceId(); 508abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 509abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 510abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki /** 511b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki * @hide kept for testing. 5126f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 513abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki public int getShortcutIconResId(@NonNull String packageName, @NonNull String shortcutId, 514abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @NonNull UserHandle user) { 515b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki final ShortcutQuery q = new ShortcutQuery(); 516b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki q.setPackage(packageName); 517b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki q.setShortcutIds(Arrays.asList(shortcutId)); 518b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki q.setQueryFlags(ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED); 519b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki final List<ShortcutInfo> shortcuts = getShortcuts(q, user); 520abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 521b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki return shortcuts.size() > 0 ? shortcuts.get(0).getIconResourceId() : 0; 5226f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 5236f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 5246f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 5256f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Return the icon as {@link ParcelFileDescriptor}, when it's stored as a file 5266f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * (i.e. when {@link ShortcutInfo#hasIconFile()} returns {@code true}). 5276f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 5282d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 5292d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * #hasShortcutHostPermission()}. 5306f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 5316f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param shortcut The target shortcut. 532538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 533538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 534abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki */ 535abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki public ParcelFileDescriptor getShortcutIconFd( 536abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @NonNull ShortcutInfo shortcut) { 537abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return getShortcutIconFd(shortcut.getPackageName(), shortcut.getId(), 538abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki shortcut.getUserId()); 539abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 540abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 541abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki /** 542abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * Return the icon as {@link ParcelFileDescriptor}, when it's stored as a file 543abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * (i.e. when {@link ShortcutInfo#hasIconFile()} returns {@code true}). 544abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * 545abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 546abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * #hasShortcutHostPermission()}. 547abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * 548abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @param packageName The target package name. 549abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @param shortcutId The ID of the shortcut to lad rom. 5506f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param user The UserHandle of the profile. 551538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 552538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 5536f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 5546f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public ParcelFileDescriptor getShortcutIconFd( 555abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @NonNull String packageName, @NonNull String shortcutId, @NonNull UserHandle user) { 556abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return getShortcutIconFd(packageName, shortcutId, user.getIdentifier()); 557abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 558abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 559abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki private ParcelFileDescriptor getShortcutIconFd( 560abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @NonNull String packageName, @NonNull String shortcutId, int userId) { 5615504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki try { 562abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return mService.getShortcutIconFd(mContext.getPackageName(), 563abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki packageName, shortcutId, userId); 5645504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki } catch (RemoteException e) { 5655504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki throw e.rethrowFromSystemServer(); 5665504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki } 5676f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 5686f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 5696f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** 5706f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * Launches a shortcut. 5716f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 5722d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 5732d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki * #hasShortcutHostPermission()}. 5746f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * 57543204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki * @param packageName The target shortcut package name. 57643204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki * @param shortcutId The target shortcut ID. 5776f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param sourceBounds The Rect containing the source bounds of the clicked icon. 5786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param startActivityOptions Options to pass to startActivity. 5796f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki * @param user The UserHandle of the profile. 58043204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki * @return {@code false} when the shortcut is no longer valid (e.g. the creator application 58143204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki * has been uninstalled). {@code true} when the shortcut is still valid. 582538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 583538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 5846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki */ 58543204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki public boolean startShortcut(@NonNull String packageName, @NonNull String shortcutId, 5866f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions, 5876f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @NonNull UserHandle user) { 588abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return startShortcut(packageName, shortcutId, sourceBounds, startActivityOptions, 589abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki user.getIdentifier()); 590abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 591abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 592abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki /** 593abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * Launches a shortcut. 594abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * 595abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * <p>Callers must be allowed to access the shortcut information, as defined in {@link 596abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * #hasShortcutHostPermission()}. 597abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * 598abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @param shortcut The target shortcut. 599abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @param sourceBounds The Rect containing the source bounds of the clicked icon. 600abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @param startActivityOptions Options to pass to startActivity. 601abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * @return {@code false} when the shortcut is no longer valid (e.g. the creator application 602abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki * has been uninstalled). {@code true} when the shortcut is still valid. 603538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * 604538c440c33fc2b9e0bf0c680ddbb14f9a079ff6aMakoto Onuki * @hide 605abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki */ 606abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki public boolean startShortcut(@NonNull ShortcutInfo shortcut, 607abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions) { 608abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki return startShortcut(shortcut.getPackageName(), shortcut.getId(), 609abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki sourceBounds, startActivityOptions, 610abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki shortcut.getUserId()); 611abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki } 612abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki 613abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki private boolean startShortcut(@NonNull String packageName, @NonNull String shortcutId, 614abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions, 615abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki int userId) { 6166f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki try { 61743204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki return mService.startShortcut(mContext.getPackageName(), packageName, shortcutId, 618abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki sourceBounds, startActivityOptions, userId); 6196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } catch (RemoteException e) { 6206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki throw e.rethrowFromSystemServer(); 6216f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 6226f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 62353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 62453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy /** 62510a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * Registers a callback for changes to packages in current and managed profiles. 626c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 62710a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * @param callback The callback to register. 628c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 62910a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy public void registerCallback(Callback callback) { 63010a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy registerCallback(callback, null); 631b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 632b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 633b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy /** 63410a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * Registers a callback for changes to packages in current and managed profiles. 635b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * 63610a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * @param callback The callback to register. 637b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy * @param handler that should be used to post callbacks on, may be null. 638b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy */ 63910a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy public void registerCallback(Callback callback, Handler handler) { 640c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy synchronized (this) { 641172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy if (callback != null && findCallbackLocked(callback) < 0) { 642b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy boolean addedFirstCallback = mCallbacks.size() == 0; 643b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy addCallbackLocked(callback, handler); 644b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy if (addedFirstCallback) { 645c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy try { 6464dbe0ded4ae9faaef580be80184fca0749e27198Makoto Onuki mService.addOnAppsChangedListener(mContext.getPackageName(), 6474dbe0ded4ae9faaef580be80184fca0749e27198Makoto Onuki mAppsChangedListener); 648c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } catch (RemoteException re) { 649f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 650c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 651c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 652c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 653c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 654c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 655c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy 656c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy /** 65710a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * Unregisters a callback that was previously registered. 658c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy * 65910a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * @param callback The callback to unregister. 66010a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy * @see #registerCallback(Callback) 661c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy */ 66210a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy public void unregisterCallback(Callback callback) { 663c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy synchronized (this) { 664b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy removeCallbackLocked(callback); 66544b6dee70eb2dfb7e26aeec9b2640d64e4f7d199Kenny Guy if (mCallbacks.size() == 0) { 666e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani try { 667e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani mService.removeOnAppsChangedListener(mAppsChangedListener); 668e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani } catch (RemoteException re) { 669f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey throw re.rethrowFromSystemServer(); 670e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani } 6714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 6724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 6734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 6744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 675172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy /** @return position in mCallbacks for callback or -1 if not present. */ 676172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy private int findCallbackLocked(Callback callback) { 677b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy if (callback == null) { 678b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy throw new IllegalArgumentException("Callback cannot be null"); 679b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 680b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy final int size = mCallbacks.size(); 681b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (int i = 0; i < size; ++i) { 682b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy if (mCallbacks.get(i).mCallback == callback) { 683172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy return i; 684b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 685b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 686172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy return -1; 687172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy } 688172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy 689172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy private void removeCallbackLocked(Callback callback) { 690172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy int pos = findCallbackLocked(callback); 691172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy if (pos >= 0) { 692172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy mCallbacks.remove(pos); 693172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy } 694b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 695b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 696f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy private void addCallbackLocked(Callback callback, Handler handler) { 697b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy // Remove if already present. 698b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy removeCallbackLocked(callback); 699b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy if (handler == null) { 700b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy handler = new Handler(); 701b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 702b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackMessageHandler toAdd = new CallbackMessageHandler(handler.getLooper(), callback); 703b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallbacks.add(toAdd); 704b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 705b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 7064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private IOnAppsChangedListener.Stub mAppsChangedListener = new IOnAppsChangedListener.Stub() { 7074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 7084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 709b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void onPackageRemoved(UserHandle user, String packageName) 710b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy throws RemoteException { 7114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 7124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageRemoved " + user.getIdentifier() + "," + packageName); 7134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 715b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 716b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy callback.postOnPackageRemoved(packageName, user); 717c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 7184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 7214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 7224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageChanged(UserHandle user, String packageName) throws RemoteException { 7234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 7244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageChanged " + user.getIdentifier() + "," + packageName); 7254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 727b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 728b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy callback.postOnPackageChanged(packageName, user); 729c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 7304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 7334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 7344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageAdded(UserHandle user, String packageName) throws RemoteException { 7354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 7364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageAdded " + user.getIdentifier() + "," + packageName); 7374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 739b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 740b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy callback.postOnPackageAdded(packageName, user); 741c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 7424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 7454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 7464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing) 7474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 7484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 7494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + "," + packageNames); 7504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 752b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 753b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy callback.postOnPackagesAvailable(packageNames, user, replacing); 754c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 7554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 7584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 7594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing) 7604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 7614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 7624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + "," + packageNames); 7634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 765b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 766b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy callback.postOnPackagesUnavailable(packageNames, user, replacing); 767c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy } 768772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 769772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 770772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 771772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy @Override 772772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void onPackagesSuspended(UserHandle user, String[] packageNames) 773772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy throws RemoteException { 774772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy if (DEBUG) { 775772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy Log.d(TAG, "onPackagesSuspended " + user.getIdentifier() + "," + packageNames); 776772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 777772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy synchronized (LauncherApps.this) { 778772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 779772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy callback.postOnPackagesSuspended(packageNames, user); 780772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 781772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 782772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 783772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 784772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy @Override 785772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void onPackagesUnsuspended(UserHandle user, String[] packageNames) 786772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy throws RemoteException { 787772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy if (DEBUG) { 788772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy Log.d(TAG, "onPackagesUnsuspended " + user.getIdentifier() + "," + packageNames); 789772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 790772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy synchronized (LauncherApps.this) { 791772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy for (CallbackMessageHandler callback : mCallbacks) { 792772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy callback.postOnPackagesUnsuspended(packageNames, user); 793772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 794772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 7954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 7966f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 7976f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki @Override 7986f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void onShortcutChanged(UserHandle user, String packageName, 7996f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki ParceledListSlice shortcuts) { 8006f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki if (DEBUG) { 8016f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki Log.d(TAG, "onShortcutChanged " + user.getIdentifier() + "," + packageName); 8026f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 8036f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki final List<ShortcutInfo> list = shortcuts.getList(); 8046f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki synchronized (LauncherApps.this) { 8056f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki for (CallbackMessageHandler callback : mCallbacks) { 8066f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki callback.postOnShortcutChanged(packageName, user, list); 8076f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 8086f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 8096f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 8104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani }; 811b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 812b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static class CallbackMessageHandler extends Handler { 813b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static final int MSG_ADDED = 1; 814b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static final int MSG_REMOVED = 2; 815b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static final int MSG_CHANGED = 3; 816b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static final int MSG_AVAILABLE = 4; 817b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static final int MSG_UNAVAILABLE = 5; 818772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy private static final int MSG_SUSPENDED = 6; 819772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy private static final int MSG_UNSUSPENDED = 7; 8206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki private static final int MSG_SHORTCUT_CHANGED = 8; 821b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 822f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy private LauncherApps.Callback mCallback; 823b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 824b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy private static class CallbackInfo { 825b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy String[] packageNames; 826b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy String packageName; 827b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy boolean replacing; 828b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy UserHandle user; 8296f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki List<ShortcutInfo> shortcuts; 830b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 831b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 832f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy public CallbackMessageHandler(Looper looper, LauncherApps.Callback callback) { 833b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy super(looper, null, true); 834b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback = callback; 835b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 836b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 837b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy @Override 838b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void handleMessage(Message msg) { 839b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy if (mCallback == null || !(msg.obj instanceof CallbackInfo)) { 840b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy return; 841b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 842b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = (CallbackInfo) msg.obj; 843b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy switch (msg.what) { 844b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy case MSG_ADDED: 845b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback.onPackageAdded(info.packageName, info.user); 846b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy break; 847b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy case MSG_REMOVED: 848b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback.onPackageRemoved(info.packageName, info.user); 849b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy break; 850b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy case MSG_CHANGED: 851b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback.onPackageChanged(info.packageName, info.user); 852b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy break; 853b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy case MSG_AVAILABLE: 854b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback.onPackagesAvailable(info.packageNames, info.user, info.replacing); 855b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy break; 856b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy case MSG_UNAVAILABLE: 857b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy mCallback.onPackagesUnavailable(info.packageNames, info.user, info.replacing); 858b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy break; 859772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy case MSG_SUSPENDED: 860772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy mCallback.onPackagesSuspended(info.packageNames, info.user); 861772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy break; 862772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy case MSG_UNSUSPENDED: 863772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy mCallback.onPackagesUnsuspended(info.packageNames, info.user); 864772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy break; 8656f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki case MSG_SHORTCUT_CHANGED: 8666f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki mCallback.onShortcutsChanged(info.packageName, info.shortcuts, info.user); 8676f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki break; 868b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 869b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 870b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 871b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void postOnPackageAdded(String packageName, UserHandle user) { 872b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = new CallbackInfo(); 873b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.packageName = packageName; 874b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.user = user; 875b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy obtainMessage(MSG_ADDED, info).sendToTarget(); 876b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 877b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 878b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void postOnPackageRemoved(String packageName, UserHandle user) { 879b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = new CallbackInfo(); 880b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.packageName = packageName; 881b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.user = user; 882b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy obtainMessage(MSG_REMOVED, info).sendToTarget(); 883b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 884b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 885b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void postOnPackageChanged(String packageName, UserHandle user) { 886b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = new CallbackInfo(); 887b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.packageName = packageName; 888b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.user = user; 889b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy obtainMessage(MSG_CHANGED, info).sendToTarget(); 890b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 891b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 892b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void postOnPackagesAvailable(String[] packageNames, UserHandle user, 893b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy boolean replacing) { 894b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = new CallbackInfo(); 895b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.packageNames = packageNames; 896b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.replacing = replacing; 897b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.user = user; 898b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy obtainMessage(MSG_AVAILABLE, info).sendToTarget(); 899b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 900b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy 901b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy public void postOnPackagesUnavailable(String[] packageNames, UserHandle user, 902b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy boolean replacing) { 903b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy CallbackInfo info = new CallbackInfo(); 904b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.packageNames = packageNames; 905b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.replacing = replacing; 906b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy info.user = user; 907b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy obtainMessage(MSG_UNAVAILABLE, info).sendToTarget(); 908b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 909772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 910772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void postOnPackagesSuspended(String[] packageNames, UserHandle user) { 911772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy CallbackInfo info = new CallbackInfo(); 912772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy info.packageNames = packageNames; 913772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy info.user = user; 914772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy obtainMessage(MSG_SUSPENDED, info).sendToTarget(); 915772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 916772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy 917772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy public void postOnPackagesUnsuspended(String[] packageNames, UserHandle user) { 918772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy CallbackInfo info = new CallbackInfo(); 919772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy info.packageNames = packageNames; 920772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy info.user = user; 921772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy obtainMessage(MSG_UNSUSPENDED, info).sendToTarget(); 922772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy } 9236f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki 9246f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki public void postOnShortcutChanged(String packageName, UserHandle user, 9256f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki List<ShortcutInfo> shortcuts) { 9266f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki CallbackInfo info = new CallbackInfo(); 9276f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki info.packageName = packageName; 9286f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki info.user = user; 9296f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki info.shortcuts = shortcuts; 9306f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki obtainMessage(MSG_SHORTCUT_CHANGED, info).sendToTarget(); 9316f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 932b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy } 9334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani} 934