LauncherApps.java revision 4f58263d02f296430a9653126d28501e95c7bb6c
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 194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.ComponentName; 204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Context; 214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Intent; 224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ILauncherApps; 234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.IOnAppsChangedListener; 244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.graphics.Rect; 254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Bundle; 264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteException; 274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserHandle; 284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Log; 294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList; 314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.Collections; 324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List; 334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/** 354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Class for retrieving a list of launchable activities for the current user and any associated 364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * managed profiles. This is mainly for use by launchers. Apps can be queried for each user profile. 374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Since the PackageManager will not deliver package broadcasts for other profiles, you can register 384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * for package changes here. 394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherApps { 414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani static final String TAG = "LauncherApps"; 434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani static final boolean DEBUG = false; 444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private Context mContext; 464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private ILauncherApps mService; 474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private List<OnAppsChangedListener> mListeners 494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani = new ArrayList<OnAppsChangedListener>(); 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Callbacks for changes to this and related managed profiles. 534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public interface OnAppsChangedListener { 554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Indicates that a package was removed from the specified profile. 574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile that generated the change. 594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageName The name of the package that was removed. 604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void onPackageRemoved(UserHandle user, String packageName); 624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Indicates that a package was added to the specified profile. 654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile that generated the change. 674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageName The name of the package that was added. 684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void onPackageAdded(UserHandle user, String packageName); 704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Indicates that a package was modified in the specified profile. 734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile that generated the change. 754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageName The name of the package that has changed. 764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void onPackageChanged(UserHandle user, String packageName); 784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Indicates that one or more packages have become available. For 814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * example, this can happen when a removable storage card has 824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * reappeared. 834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile that generated the change. 854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageNames The names of the packages that have become 864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * available. 874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param replacing Indicates whether these packages are replacing 884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * existing ones. 894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing); 914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Indicates that one or more packages have become unavailable. For 944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * example, this can happen when a removable storage card has been 954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * removed. 964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile that generated the change. 984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageNames The names of the packages that have become 994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * unavailable. 1004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param replacing Indicates whether the packages are about to be 1014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * replaced with new versions. 1024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing); 1044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** @hide */ 1074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherApps(Context context, ILauncherApps service) { 1084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext = context; 1094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService = service; 1104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Retrieves a list of launchable activities that match {@link Intent#ACTION_MAIN} and 1144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * {@link Intent#CATEGORY_LAUNCHER}, for a specified user. 1154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 1164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param packageName The specific package to query. If null, it checks all installed packages 1174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * in the profile. 1184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile. 1194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @return List of launchable activities. Can be an empty list but will not be null. 1204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) { 1224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani List<ResolveInfo> activities = null; 1234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani activities = mService.getLauncherActivities(packageName, user); 1254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 1264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (activities == null) { 1284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return Collections.EMPTY_LIST; 1294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ArrayList<LauncherActivityInfo> lais = new ArrayList<LauncherActivityInfo>(); 1314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int count = activities.size(); 1324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < count; i++) { 1334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ResolveInfo ri = activities.get(i); 1344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani LauncherActivityInfo lai = new LauncherActivityInfo(mContext, ri, user); 1354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 1364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.v(TAG, "Returning activity for profile " + user + " : " 1374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani + lai.getComponentName()); 1384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani lais.add(lai); 1404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return lais; 1424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani static ComponentName getComponentName(ResolveInfo ri) { 1454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name); 1464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Returns the activity info for a given intent and user handle, if it resolves. Otherwise it 1504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * returns null. 1514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 1524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param intent The intent to find a match for. 1534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The profile to look in for a match. 1544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @return An activity info object if there is a match. 1554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) { 1574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ResolveInfo ri = mService.resolveActivity(intent, user); 1594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (ri != null) { 1604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani LauncherActivityInfo info = new LauncherActivityInfo(mContext, ri, user); 1614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return info; 1624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 1644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return null; 1654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return null; 1674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Starts an activity in the specified profile. 1714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 1724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param component The ComponentName of the activity to launch 1734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param sourceBounds The Rect containing the source bounds of the clicked icon 1744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param opts Options to pass to startActivity 1754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param user The UserHandle of the profile 1764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void startActivityForProfile(ComponentName component, Rect sourceBounds, 1784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Bundle opts, UserHandle user) { 1794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService.startActivityAsUser(component, sourceBounds, opts, user); 1814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 1824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // Oops! 1834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Adds a listener for changes to packages in current and managed profiles. 1884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 1894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param listener The listener to add. 1904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public synchronized void addOnAppsChangedListener(OnAppsChangedListener listener) { 1924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (listener != null && !mListeners.contains(listener)) { 1934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.add(listener); 1944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.size() == 1) { 1954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService.addOnAppsChangedListener(mAppsChangedListener); 1974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 1984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 2044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Removes a listener that was previously added. 2054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 2064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @param listener The listener to remove. 2074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see #addOnAppsChangedListener(OnAppsChangedListener) 2084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 2094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public synchronized void removeOnAppsChangedListener(OnAppsChangedListener listener) { 2104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.remove(listener); 2114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.size() == 0) { 2124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mService.removeOnAppsChangedListener(mAppsChangedListener); 2144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private IOnAppsChangedListener.Stub mAppsChangedListener = new IOnAppsChangedListener.Stub() { 2204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageRemoved(UserHandle user, String packageName) throws RemoteException { 2234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 2244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageRemoved " + user.getIdentifier() + "," + packageName); 2254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 2274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (OnAppsChangedListener listener : mListeners) { 2284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageRemoved(user, packageName); 2294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageChanged(UserHandle user, String packageName) throws RemoteException { 2354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 2364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageChanged " + user.getIdentifier() + "," + packageName); 2374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 2394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (OnAppsChangedListener listener : mListeners) { 2404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageChanged(user, packageName); 2414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageAdded(UserHandle user, String packageName) throws RemoteException { 2474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 2484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackageAdded " + user.getIdentifier() + "," + packageName); 2494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 2514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (OnAppsChangedListener listener : mListeners) { 2524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageAdded(user, packageName); 2534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing) 2594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 2604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 2614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + "," + packageNames); 2624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 2644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (OnAppsChangedListener listener : mListeners) { 2654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesAvailable(user, packageNames, replacing); 2664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing) 2724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 2734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (DEBUG) { 2744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + "," + packageNames); 2754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherApps.this) { 2774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (OnAppsChangedListener listener : mListeners) { 2784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesUnavailable(user, packageNames, replacing); 2794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani }; 2834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani} 284