LauncherApps.java revision dd6cb55b0ef324096ff9f04a75864ecc43397c4f
1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/*
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Copyright (C) 2014 The Android Open Source Project
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * you may not use this file except in compliance with the License.
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * You may obtain a copy of the License at
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * See the License for the specific language governing permissions and
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * limitations under the License.
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage android.content.pm;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.app.AppGlobals;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.ComponentName;
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.Context;
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.Intent;
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.pm.ILauncherApps;
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.pm.IOnAppsChangedListener;
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.graphics.Rect;
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.Bundle;
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.Handler;
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.Looper;
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.Message;
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.RemoteException;
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.UserHandle;
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.os.UserManager;
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport android.util.Log;
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.ArrayList;
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Collections;
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List;
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Class for retrieving a list of launchable activities for the current user and any associated
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * managed profiles. This is mainly for use by launchers. Apps can be queried for each user profile.
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Since the PackageManager will not deliver package broadcasts for other profiles, you can register
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * for package changes here.
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <p>
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * To watch for managed profiles being added or removed, register for the following broadcasts:
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * {@link Intent#ACTION_MANAGED_PROFILE_ADDED} and {@link Intent#ACTION_MANAGED_PROFILE_REMOVED}.
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <p>
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * You can retrieve the list of profiles associated with this user with
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * {@link UserManager#getUserProfiles()}.
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic class LauncherApps {
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static final String TAG = "LauncherApps";
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static final boolean DEBUG = false;
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private Context mContext;
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private ILauncherApps mService;
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private PackageManager mPm;
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private List<CallbackMessageHandler> mCallbacks
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            = new ArrayList<CallbackMessageHandler>();
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Callbacks for package changes to this and related managed profiles.
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static abstract class Callback {
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /**
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * Indicates that a package was removed from the specified profile.
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * If a package is removed while being updated onPackageChanged will be
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * called instead.
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param packageName The name of the package that was removed.
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param user The UserHandle of the profile that generated the change.
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         */
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        abstract public void onPackageRemoved(String packageName, UserHandle user);
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /**
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * Indicates that a package was added to the specified profile.
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * If a package is added while being updated then onPackageChanged will be
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * called instead.
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param packageName The name of the package that was added.
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param user The UserHandle of the profile that generated the change.
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         */
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        abstract public void onPackageAdded(String packageName, UserHandle user);
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /**
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * Indicates that a package was modified in the specified profile.
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * This can happen, for example, when the package is updated or when
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * one or more components are enabled or disabled.
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param packageName The name of the package that has changed.
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param user The UserHandle of the profile that generated the change.
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         */
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        abstract public void onPackageChanged(String packageName, UserHandle user);
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /**
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * Indicates that one or more packages have become available. For
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * example, this can happen when a removable storage card has
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * reappeared.
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param packageNames The names of the packages that have become
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *            available.
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param user The UserHandle of the profile that generated the change.
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param replacing Indicates whether these packages are replacing
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *            existing ones.
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         */
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        abstract public void onPackagesAvailable(String[] packageNames, UserHandle user,
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                boolean replacing);
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /**
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * Indicates that one or more packages have become unavailable. For
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * example, this can happen when a removable storage card has been
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * removed.
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param packageNames The names of the packages that have become
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *            unavailable.
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param user The UserHandle of the profile that generated the change.
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         * @param replacing Indicates whether the packages are about to be
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         *            replaced with new versions.
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project         */
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        abstract public void onPackagesUnavailable(String[] packageNames, UserHandle user,
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                boolean replacing);
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /** @hide */
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public LauncherApps(Context context, ILauncherApps service) {
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        mContext = context;
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        mService = service;
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        mPm = context.getPackageManager();
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Retrieves a list of launchable activities that match {@link Intent#ACTION_MAIN} and
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * {@link Intent#CATEGORY_LAUNCHER}, for a specified user.
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param packageName The specific package to query. If null, it checks all installed packages
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *            in the profile.
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The UserHandle of the profile.
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return List of launchable activities. Can be an empty list but will not be null.
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) {
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        List<ResolveInfo> activities = null;
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            activities = mService.getLauncherActivities(packageName, user);
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (activities == null) {
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return Collections.EMPTY_LIST;
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ArrayList<LauncherActivityInfo> lais = new ArrayList<LauncherActivityInfo>();
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int count = activities.size();
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < count; i++) {
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            ResolveInfo ri = activities.get(i);
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            long firstInstallTime = 0;
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            try {
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                firstInstallTime = mPm.getPackageInfo(ri.activityInfo.packageName,
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES).firstInstallTime;
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            } catch (NameNotFoundException nnfe) {
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // Sorry, can't find package
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            LauncherActivityInfo lai = new LauncherActivityInfo(mContext, ri, user,
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    firstInstallTime);
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.v(TAG, "Returning activity for profile " + user + " : "
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        + lai.getComponentName());
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            lais.add(lai);
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return lais;
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static ComponentName getComponentName(ResolveInfo ri) {
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Returns the activity info for a given intent and user handle, if it resolves. Otherwise it
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * returns null.
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param intent The intent to find a match for.
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The profile to look in for a match.
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return An activity info object if there is a match.
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) {
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            ResolveInfo ri = mService.resolveActivity(intent, user);
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (ri != null) {
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                long firstInstallTime = 0;
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                try {
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    firstInstallTime = mPm.getPackageInfo(ri.activityInfo.packageName,
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            PackageManager.GET_UNINSTALLED_PACKAGES).firstInstallTime;
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                } catch (NameNotFoundException nnfe) {
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // Sorry, can't find package
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                LauncherActivityInfo info = new LauncherActivityInfo(mContext, ri, user,
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        firstInstallTime);
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return info;
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new RuntimeException("Failed to call LauncherAppsService");
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return null;
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Starts a Main activity in the specified profile.
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param component The ComponentName of the activity to launch
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The UserHandle of the profile
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param sourceBounds The Rect containing the source bounds of the clicked icon
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param opts Options to pass to startActivity
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void startMainActivity(ComponentName component, UserHandle user, Rect sourceBounds,
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Bundle opts) {
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (DEBUG) {
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Log.i(TAG, "StartMainActivity " + component + " " + user.getIdentifier());
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            mService.startActivityAsUser(component, sourceBounds, opts, user);
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // Oops!
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Starts the settings activity to show the application details for a
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * package in the specified profile.
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param component The ComponentName of the package to launch settings for.
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The UserHandle of the profile
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param sourceBounds The Rect containing the source bounds of the clicked icon
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param opts Options to pass to startActivity
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void startAppDetailsActivity(ComponentName component, UserHandle user,
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Rect sourceBounds, Bundle opts) {
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            mService.showAppDetailsAsUser(component, sourceBounds, opts, user);
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // Oops!
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Checks if the package is installed and enabled for a profile.
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param packageName The package to check.
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The UserHandle of the profile.
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return true if the package exists and is enabled.
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean isPackageEnabled(String packageName, UserHandle user) {
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return mService.isPackageEnabled(packageName, user);
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new RuntimeException("Failed to call LauncherAppsService");
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Checks if the activity exists and it enabled for a profile.
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param component The activity to check.
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param user The UserHandle of the profile.
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return true if the activity exists and is enabled.
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean isActivityEnabled(ComponentName component, UserHandle user) {
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try {
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return mService.isActivityEnabled(component, user);
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } catch (RemoteException re) {
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new RuntimeException("Failed to call LauncherAppsService");
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Registers a callback for changes to packages in current and managed profiles.
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param callback The callback to register.
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void registerCallback(Callback callback) {
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        registerCallback(callback, null);
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Registers a callback for changes to packages in current and managed profiles.
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param callback The callback to register.
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param handler that should be used to post callbacks on, may be null.
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void registerCallback(Callback callback, Handler handler) {
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        synchronized (this) {
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (callback != null && !mCallbacks.contains(callback)) {
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                boolean addedFirstCallback = mCallbacks.size() == 0;
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                addCallbackLocked(callback, handler);
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (addedFirstCallback) {
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    try {
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        mService.addOnAppsChangedListener(mAppsChangedListener);
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    } catch (RemoteException re) {
304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Unregisters a callback that was previously registered.
312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param callback The callback to unregister.
314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #registerCallback(Callback)
315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public void unregisterCallback(Callback callback) {
317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        synchronized (this) {
318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            removeCallbackLocked(callback);
319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (mCallbacks.size() == 0) {
320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                try {
321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mService.removeOnAppsChangedListener(mAppsChangedListener);
322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                } catch (RemoteException re) {
323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void removeCallbackLocked(Callback callback) {
329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (callback == null) {
330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException("Callback cannot be null");
331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int size = mCallbacks.size();
333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < size; ++i) {
334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (mCallbacks.get(i).mCallback == callback) {
335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                mCallbacks.remove(i);
336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return;
337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private void addCallbackLocked(Callback callback, Handler handler) {
342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // Remove if already present.
343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        removeCallbackLocked(callback);
344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (handler == null) {
345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            handler = new Handler();
346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        CallbackMessageHandler toAdd = new CallbackMessageHandler(handler.getLooper(), callback);
348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        mCallbacks.add(toAdd);
349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private IOnAppsChangedListener.Stub mAppsChangedListener = new IOnAppsChangedListener.Stub() {
352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void onPackageRemoved(UserHandle user, String packageName)
355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throws RemoteException {
356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.d(TAG, "onPackageRemoved " + user.getIdentifier() + "," + packageName);
358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (LauncherApps.this) {
360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (CallbackMessageHandler callback : mCallbacks) {
361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    callback.postOnPackageRemoved(packageName, user);
362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void onPackageChanged(UserHandle user, String packageName) throws RemoteException {
368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.d(TAG, "onPackageChanged " + user.getIdentifier() + "," + packageName);
370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (LauncherApps.this) {
372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (CallbackMessageHandler callback : mCallbacks) {
373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    callback.postOnPackageChanged(packageName, user);
374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void onPackageAdded(UserHandle user, String packageName) throws RemoteException {
380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.d(TAG, "onPackageAdded " + user.getIdentifier() + "," + packageName);
382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (LauncherApps.this) {
384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (CallbackMessageHandler callback : mCallbacks) {
385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    callback.postOnPackageAdded(packageName, user);
386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing)
392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throws RemoteException {
393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + "," + packageNames);
395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (LauncherApps.this) {
397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (CallbackMessageHandler callback : mCallbacks) {
398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    callback.postOnPackagesAvailable(packageNames, user, replacing);
399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing)
405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throws RemoteException {
406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) {
407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + "," + packageNames);
408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (LauncherApps.this) {
410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (CallbackMessageHandler callback : mCallbacks) {
411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    callback.postOnPackagesUnavailable(packageNames, user, replacing);
412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project           }
414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    };
416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static class CallbackMessageHandler extends Handler {
418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int MSG_ADDED = 1;
419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int MSG_REMOVED = 2;
420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int MSG_CHANGED = 3;
421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int MSG_AVAILABLE = 4;
422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static final int MSG_UNAVAILABLE = 5;
423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private LauncherApps.Callback mCallback;
425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private static class CallbackInfo {
427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            String[] packageNames;
428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            String packageName;
429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            boolean replacing;
430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            UserHandle user;
431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public CallbackMessageHandler(Looper looper, LauncherApps.Callback callback) {
434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            super(looper, null, true);
435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            mCallback = callback;
436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        @Override
439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void handleMessage(Message msg) {
440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (mCallback == null || !(msg.obj instanceof CallbackInfo)) {
441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return;
442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = (CallbackInfo) msg.obj;
444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (msg.what) {
445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case MSG_ADDED:
446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mCallback.onPackageAdded(info.packageName, info.user);
447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case MSG_REMOVED:
449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mCallback.onPackageRemoved(info.packageName, info.user);
450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case MSG_CHANGED:
452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mCallback.onPackageChanged(info.packageName, info.user);
453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case MSG_AVAILABLE:
455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mCallback.onPackagesAvailable(info.packageNames, info.user, info.replacing);
456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case MSG_UNAVAILABLE:
458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    mCallback.onPackagesUnavailable(info.packageNames, info.user, info.replacing);
459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void postOnPackageAdded(String packageName, UserHandle user) {
464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = new CallbackInfo();
465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.packageName = packageName;
466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.user = user;
467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            obtainMessage(MSG_ADDED, info).sendToTarget();
468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void postOnPackageRemoved(String packageName, UserHandle user) {
471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = new CallbackInfo();
472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.packageName = packageName;
473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.user = user;
474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            obtainMessage(MSG_REMOVED, info).sendToTarget();
475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void postOnPackageChanged(String packageName, UserHandle user) {
478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = new CallbackInfo();
479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.packageName = packageName;
480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.user = user;
481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            obtainMessage(MSG_CHANGED, info).sendToTarget();
482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void postOnPackagesAvailable(String[] packageNames, UserHandle user,
485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                boolean replacing) {
486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = new CallbackInfo();
487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.packageNames = packageNames;
488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.replacing = replacing;
489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.user = user;
490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            obtainMessage(MSG_AVAILABLE, info).sendToTarget();
491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public void postOnPackagesUnavailable(String[] packageNames, UserHandle user,
494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                boolean replacing) {
495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            CallbackInfo info = new CallbackInfo();
496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.packageNames = packageNames;
497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.replacing = replacing;
498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            info.user = user;
499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            obtainMessage(MSG_UNAVAILABLE, info).sendToTarget();
500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}
503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project