LauncherAppsService.java revision cea2978737146485b88f06b24b5df5656f9586e1
14f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/* 24f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Copyright (C) 2014 The Android Open Source Project 34f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 44f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 54f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * you may not use this file except in compliance with the License. 64f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * You may obtain a copy of the License at 74f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 84f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 94f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * 104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Unless required by applicable law or agreed to in writing, software 114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * See the License for the specific language governing permissions and 144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * limitations under the License. 154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipackage com.android.server.pm; 184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.app.AppGlobals; 204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.ComponentName; 214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Context; 224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Intent; 2353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.ActivityInfo; 244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ILauncherApps; 254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.IOnAppsChangedListener; 2653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.IPackageManager; 274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.PackageManager; 2853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.PackageInfo; 294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ResolveInfo; 304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.UserInfo; 314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.graphics.Rect; 324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Binder; 334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Bundle; 344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.IInterface; 354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteCallbackList; 364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteException; 374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserHandle; 384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserManager; 39932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasaniimport android.util.Log; 404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Slog; 414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport com.android.internal.content.PackageMonitor; 434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList; 454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List; 464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/** 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Service that manages requests and callbacks for launchers that support 494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * managed profiles. 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherAppsService extends ILauncherApps.Stub { 52932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani private static final boolean DEBUG = false; 534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private static final String TAG = "LauncherAppsService"; 544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final Context mContext; 554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageManager mPm; 564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final UserManager mUm; 574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageCallbackList<IOnAppsChangedListener> mListeners 584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani = new PackageCallbackList<IOnAppsChangedListener>(); 594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private MyPackageMonitor mPackageMonitor = new MyPackageMonitor(); 614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherAppsService(Context context) { 634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext = context; 644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPm = mContext.getPackageManager(); 654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( 704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { 744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 75932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 76932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); 77932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 79932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 80932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Starting package monitoring"); 81932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani startWatchingPackageBroadcasts(); 834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 85932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani mListeners.register(listener, Binder.getCallingUserHandle()); 864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( 914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void removeOnAppsChangedListener(IOnAppsChangedListener listener) 954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 97932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 98932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Removing listener from " + Binder.getCallingUserHandle()); 99932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 1014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 1024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 1034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Register a receiver to watch for package broadcasts 1094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void startWatchingPackageBroadcasts() { 1114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.register(mContext, null, UserHandle.ALL, true); 1124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Unregister package broadcast receiver 1164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void stopWatchingPackageBroadcasts() { 118932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 119932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Stopped watching for packages"); 120932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.unregister(); 1224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void checkCallbackCount() { 125932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani synchronized (mListeners) { 126932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 127932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Callback count = " + mListeners.getRegisteredCallbackCount()); 128932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 1304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 1314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Checks if the caller is in the same group as the userToCheck. 1374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void ensureInUserProfiles(UserHandle userToCheck, String message) { 1394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int callingUserId = UserHandle.getCallingUserId(); 1404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int targetUserId = userToCheck.getIdentifier(); 1414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserId == callingUserId) return; 1434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo callingUserInfo = mUm.getUserInfo(callingUserId); 1474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo targetUserInfo = mUm.getUserInfo(targetUserId); 1484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserInfo == null 1494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID 1504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) { 1514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throw new SecurityException(message); 1524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 158cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina /** 159cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina * Checks if the user is enabled. 160cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina */ 161cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina private boolean isUserEnabled(UserHandle user) { 162cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina long ident = Binder.clearCallingIdentity(); 163cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina try { 164cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina UserInfo targetUserInfo = mUm.getUserInfo(user.getIdentifier()); 165cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina return targetUserInfo != null && targetUserInfo.isEnabled(); 166cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } finally { 167cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina Binder.restoreCallingIdentity(ident); 168cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 169cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 170cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina 1714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public List<ResolveInfo> getLauncherActivities(String packageName, UserHandle user) 1734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot retrieve activities for unrelated profile " + user); 175cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina if (!isUserEnabled(user)) { 176cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina return new ArrayList<ResolveInfo>(); 177cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 1784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 1804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 1811a4e0b998030bb86196559947f417ee6fe117644Kenny Guy mainIntent.setPackage(packageName); 1824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0, 1854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani user.getIdentifier()); 1864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return apps; 1874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public ResolveInfo resolveActivity(Intent intent, UserHandle user) 1944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot resolve activity for unrelated profile " + user); 196cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina if (!isUserEnabled(user)) { 197cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina return null; 198cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 1994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 2014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); 2034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return app; 2044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 2054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 2064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 21053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isPackageEnabled(String packageName, UserHandle user) 21153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 21253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user); 213cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina if (!isUserEnabled(user)) { 214cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina return false; 215cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 216cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina 21753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 21853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 21953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 22053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); 22153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.applicationInfo.enabled; 22253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 22353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 22453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 22553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 22653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 22753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 22853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isActivityEnabled(ComponentName component, UserHandle user) 22953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 23053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user); 231cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina if (!isUserEnabled(user)) { 232cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina return false; 233cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 234cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina 23553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 23653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 23753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 23853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); 23953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.isEnabled(); 24053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 24153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 24253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 24353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 24453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 24553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 2464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void startActivityAsUser(ComponentName component, Rect sourceBounds, 2474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Bundle opts, UserHandle user) throws RemoteException { 2484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user); 249cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina if (!isUserEnabled(user)) { 250cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina throw new IllegalStateException("Cannot start activity for disabled profile " + user); 251cea2978737146485b88f06b24b5df5656f9586e1Alexandra Gherghina } 2524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Intent launchIntent = new Intent(Intent.ACTION_MAIN); 2544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); 2554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setComponent(component); 2564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setSourceBounds(sourceBounds); 2574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 2604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext.startActivityAsUser(launchIntent, opts, user); 2624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 2634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 2644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private class MyPackageMonitor extends PackageMonitor { 2684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2692871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy /** Checks if user is a profile of or same as listeningUser. 2702871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy * and the user is enabled. */ 2712871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, 2722871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy String debugMsg) { 273932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (user.getIdentifier() == listeningUser.getIdentifier()) { 274932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); 275932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return true; 276932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 277932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani long ident = Binder.clearCallingIdentity(); 278932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani try { 279932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); 280932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); 281932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (userInfo == null || listeningUserInfo == null 282932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID 2832871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy || userInfo.profileGroupId != listeningUserInfo.profileGroupId 2842871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy || !userInfo.isEnabled()) { 285932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 286932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" 287932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani + debugMsg); 288932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 289932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return false; 290932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } else { 291932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 292932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" 293932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani + debugMsg); 294932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 295932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return true; 296932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 297932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } finally { 298932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Binder.restoreCallingIdentity(ident); 299932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 300932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 301932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani 3024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageAdded(String packageName, int uid) { 3044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 308932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3092871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; 3104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageAdded(user, packageName); 3124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageAdded(packageName, uid); 3194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageRemoved(String packageName, int uid) { 3234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 327932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3282871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; 3294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageRemoved(user, packageName); 3314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageRemoved(packageName, uid); 3384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageModified(String packageName) { 3424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 346932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3472871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; 3484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageChanged(user, packageName); 3504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageModified(packageName); 3574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesAvailable(String[] packages) { 3614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 365932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3662871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; 3674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesAvailable(user, packages, isReplacing()); 3694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesAvailable(packages); 3764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesUnavailable(String[] packages) { 3804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 384932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3852871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; 3864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesUnavailable(user, packages, isReplacing()); 3884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesUnavailable(packages); 3954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani class PackageCallbackList<T extends IInterface> extends RemoteCallbackList<T> { 4004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 4014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onCallbackDied(T callback, Object cookie) { 4024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani checkCallbackCount(); 4034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 4044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 4054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani} 406