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