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