LauncherAppsService.java revision 2871654830e94445842d6a67d775d7c317a7f2c0
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.BroadcastReceiver; 214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.ComponentName; 224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Context; 234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Intent; 244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.IntentFilter; 2553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.ActivityInfo; 264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ILauncherApps; 274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.IOnAppsChangedListener; 2853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.IPackageManager; 294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.PackageManager; 3053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guyimport android.content.pm.PackageInfo; 314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ResolveInfo; 324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.UserInfo; 334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.graphics.Rect; 344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Binder; 354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Bundle; 364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.IInterface; 374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteCallbackList; 384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteException; 394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserHandle; 404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserManager; 41932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasaniimport android.util.Log; 424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Slog; 434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport com.android.internal.content.PackageMonitor; 454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList; 474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List; 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/** 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Service that manages requests and callbacks for launchers that support 514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * managed profiles. 524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherAppsService extends ILauncherApps.Stub { 54932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani private static final boolean DEBUG = false; 554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private static final String TAG = "LauncherAppsService"; 564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final Context mContext; 574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageManager mPm; 584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final UserManager mUm; 594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageCallbackList<IOnAppsChangedListener> mListeners 604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani = new PackageCallbackList<IOnAppsChangedListener>(); 614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private MyPackageMonitor mPackageMonitor = new MyPackageMonitor(); 634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherAppsService(Context context) { 654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext = context; 664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPm = mContext.getPackageManager(); 674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( 724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { 764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 77932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 78932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); 79932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 81932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 82932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Starting package monitoring"); 83932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani startWatchingPackageBroadcasts(); 854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 87932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani mListeners.register(listener, Binder.getCallingUserHandle()); 884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( 934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void removeOnAppsChangedListener(IOnAppsChangedListener listener) 974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 99932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 100932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Removing listener from " + Binder.getCallingUserHandle()); 101932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 1034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 1044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 1054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Register a receiver to watch for package broadcasts 1114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void startWatchingPackageBroadcasts() { 1134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.register(mContext, null, UserHandle.ALL, true); 1144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Unregister package broadcast receiver 1184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void stopWatchingPackageBroadcasts() { 120932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 121932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Stopped watching for packages"); 122932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.unregister(); 1244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void checkCallbackCount() { 127932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani synchronized (mListeners) { 128932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 129932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Callback count = " + mListeners.getRegisteredCallbackCount()); 130932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 1314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 1324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 1334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Checks if the caller is in the same group as the userToCheck. 1394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void ensureInUserProfiles(UserHandle userToCheck, String message) { 1414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int callingUserId = UserHandle.getCallingUserId(); 1424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int targetUserId = userToCheck.getIdentifier(); 1434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserId == callingUserId) return; 1454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo callingUserInfo = mUm.getUserInfo(callingUserId); 1494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo targetUserInfo = mUm.getUserInfo(targetUserId); 1504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserInfo == null 1514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID 1524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) { 1534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throw new SecurityException(message); 1544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public List<ResolveInfo> getLauncherActivities(String packageName, UserHandle user) 1624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot retrieve activities for unrelated profile " + user); 1644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 1664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 1671a4e0b998030bb86196559947f417ee6fe117644Kenny Guy mainIntent.setPackage(packageName); 1684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0, 1714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani user.getIdentifier()); 1724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return apps; 1734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public ResolveInfo resolveActivity(Intent intent, UserHandle user) 1804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot resolve activity for unrelated profile " + user); 1824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); 1864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return app; 1874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 19353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isPackageEnabled(String packageName, UserHandle user) 19453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 19553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user); 19653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 19753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 19853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 19953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); 20053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.applicationInfo.enabled; 20153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 20253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 20353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 20453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 20553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 20653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 20753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isActivityEnabled(ComponentName component, UserHandle user) 20853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 20953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user); 21053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 21153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 21253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 21353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); 21453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.isEnabled(); 21553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 21653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 21753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 21853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 21953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 22053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 2214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void startActivityAsUser(ComponentName component, Rect sourceBounds, 2224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Bundle opts, UserHandle user) throws RemoteException { 2234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user); 2244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Intent launchIntent = new Intent(Intent.ACTION_MAIN); 2264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); 2274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setComponent(component); 2284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setSourceBounds(sourceBounds); 2294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int callingUserId = UserHandle.getCallingUserId(); 2324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 2334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext.startActivityAsUser(launchIntent, opts, user); 2354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 2364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 2374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private class MyPackageMonitor extends PackageMonitor { 2414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2422871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy /** Checks if user is a profile of or same as listeningUser. 2432871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy * and the user is enabled. */ 2442871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, 2452871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy String debugMsg) { 246932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (user.getIdentifier() == listeningUser.getIdentifier()) { 247932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); 248932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return true; 249932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 250932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani long ident = Binder.clearCallingIdentity(); 251932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani try { 252932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); 253932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); 254932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (userInfo == null || listeningUserInfo == null 255932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID 2562871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy || userInfo.profileGroupId != listeningUserInfo.profileGroupId 2572871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy || !userInfo.isEnabled()) { 258932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 259932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" 260932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani + debugMsg); 261932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 262932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return false; 263932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } else { 264932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani if (DEBUG) { 265932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" 266932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani + debugMsg); 267932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 268932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani return true; 269932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 270932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } finally { 271932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani Binder.restoreCallingIdentity(ident); 272932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 273932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani } 274932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani 2754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageAdded(String packageName, int uid) { 2774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 281932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 2822871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; 2834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageAdded(user, packageName); 2854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 2874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 2904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageAdded(packageName, uid); 2924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageRemoved(String packageName, int uid) { 2964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 300932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3012871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; 3024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageRemoved(user, packageName); 3044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageRemoved(packageName, uid); 3114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageModified(String packageName) { 3154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 319932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3202871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; 3214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageChanged(user, packageName); 3234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageModified(packageName); 3304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesAvailable(String[] packages) { 3344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 338932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3392871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; 3404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesAvailable(user, packages, isReplacing()); 3424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesAvailable(packages); 3494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesUnavailable(String[] packages) { 3534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 357932249db930d78131c4314ff46ec5fca76cb46cdAmith Yamasani UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); 3582871654830e94445842d6a67d775d7c317a7f2c0Kenny Guy if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; 3594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesUnavailable(user, packages, isReplacing()); 3614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesUnavailable(packages); 3684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani class PackageCallbackList<T extends IInterface> extends RemoteCallbackList<T> { 3734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onCallbackDied(T callback, Object cookie) { 3754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani checkCallbackCount(); 3764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani} 379