LauncherAppsService.java revision 53fa4ec7f466e70fe3e33d15c4abfc9bb557eb10
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; 414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Slog; 424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport com.android.internal.content.PackageMonitor; 444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList; 464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List; 474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/** 494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Service that manages requests and callbacks for launchers that support 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * managed profiles. 514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherAppsService extends ILauncherApps.Stub { 534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private static final String TAG = "LauncherAppsService"; 554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final Context mContext; 564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageManager mPm; 574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final UserManager mUm; 584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private final PackageCallbackList<IOnAppsChangedListener> mListeners 594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani = new PackageCallbackList<IOnAppsChangedListener>(); 604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private MyPackageMonitor mPackageMonitor = new MyPackageMonitor(); 624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public LauncherAppsService(Context context) { 644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext = context; 654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPm = mContext.getPackageManager(); 664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( 714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { 754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani startWatchingPackageBroadcasts(); 784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.register(listener); 814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /* 854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( 864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * android.content.pm.IOnAppsChangedListener) 874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void removeOnAppsChangedListener(IOnAppsChangedListener listener) 904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (mListeners) { 924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.unregister(listener); 934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Register a receiver to watch for package broadcasts 1014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void startWatchingPackageBroadcasts() { 1034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.register(mContext, null, UserHandle.ALL, true); 1044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Unregister package broadcast receiver 1084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void stopWatchingPackageBroadcasts() { 1104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mPackageMonitor.unregister(); 1114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani void checkCallbackCount() { 1144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani synchronized (LauncherAppsService.this) { 1154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (mListeners.getRegisteredCallbackCount() == 0) { 1164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani stopWatchingPackageBroadcasts(); 1174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani /** 1224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Checks if the caller is in the same group as the userToCheck. 1234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */ 1244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private void ensureInUserProfiles(UserHandle userToCheck, String message) { 1254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int callingUserId = UserHandle.getCallingUserId(); 1264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int targetUserId = userToCheck.getIdentifier(); 1274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserId == callingUserId) return; 1294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo callingUserInfo = mUm.getUserInfo(callingUserId); 1334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserInfo targetUserInfo = mUm.getUserInfo(targetUserId); 1344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani if (targetUserInfo == null 1354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID 1364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) { 1374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throw new SecurityException(message); 1384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public List<ResolveInfo> getLauncherActivities(String packageName, UserHandle user) 1464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot retrieve activities for unrelated profile " + user); 1484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 1504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 1511a4e0b998030bb86196559947f417ee6fe117644Kenny Guy mainIntent.setPackage(packageName); 1524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0, 1554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani user.getIdentifier()); 1564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return apps; 1574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 1634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public ResolveInfo resolveActivity(Intent intent, UserHandle user) 1644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani throws RemoteException { 1654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot resolve activity for unrelated profile " + user); 1664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 1684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 1694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); 1704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return app; 1714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 1724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 1734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 1754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 1764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 17753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isPackageEnabled(String packageName, UserHandle user) 17853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 17953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user); 18053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 18153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 18253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 18353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); 18453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.applicationInfo.enabled; 18553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 18653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 18753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 18853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 18953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 19053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 19153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy public boolean isActivityEnabled(ComponentName component, UserHandle user) 19253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy throws RemoteException { 19353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user); 19453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy long ident = Binder.clearCallingIdentity(); 19553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy try { 19653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy IPackageManager pm = AppGlobals.getPackageManager(); 19753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); 19853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy return info != null && info.isEnabled(); 19953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } finally { 20053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy Binder.restoreCallingIdentity(ident); 20153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 20253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy } 20353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy 20453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy @Override 2054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void startActivityAsUser(ComponentName component, Rect sourceBounds, 2064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Bundle opts, UserHandle user) throws RemoteException { 2074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user); 2084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Intent launchIntent = new Intent(Intent.ACTION_MAIN); 2104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); 2114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setComponent(component); 2124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.setSourceBounds(sourceBounds); 2134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int callingUserId = UserHandle.getCallingUserId(); 2164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani long ident = Binder.clearCallingIdentity(); 2174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mContext.startActivityAsUser(launchIntent, opts, user); 2194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } finally { 2204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Binder.restoreCallingIdentity(ident); 2214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani private class MyPackageMonitor extends PackageMonitor { 2254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2264f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2274f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageAdded(String packageName, int uid) { 2284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // TODO: if (!isProfile(user)) return; 2304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 2334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageAdded(user, packageName); 2354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 2374f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 2404f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageAdded(packageName, uid); 2424f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2434f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageRemoved(String packageName, int uid) { 2464f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2474f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // TODO: if (!isCurrentProfile(user)) return; 2484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2494f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 2514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageRemoved(user, packageName); 2534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 2554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 2584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageRemoved(packageName, uid); 2604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackageModified(String packageName) { 2644f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // TODO: if (!isProfile(user)) return; 2664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 2694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackageChanged(user, packageName); 2714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 2734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 2764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2774f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackageModified(packageName); 2784f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesAvailable(String[] packages) { 2824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 2834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // TODO: if (!isProfile(user)) return; 2844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 2854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 2864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 2874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 2884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesAvailable(user, packages, isReplacing()); 2894f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 2904f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 2914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 2944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesAvailable(packages); 2964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 2974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 2984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 2994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onPackagesUnavailable(String[] packages) { 3004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani UserHandle user = new UserHandle(getChangingUserId()); 3014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani // TODO: if (!isProfile(user)) return; 3024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani final int n = mListeners.beginBroadcast(); 3034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani for (int i = 0; i < n; i++) { 3044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); 3054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani try { 3064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani listener.onPackagesUnavailable(user, packages, isReplacing()); 3074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } catch (RemoteException re) { 3084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani Slog.d(TAG, "Callback failed ", re); 3094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani mListeners.finishBroadcast(); 3124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani super.onPackagesUnavailable(packages); 3144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani class PackageCallbackList<T extends IInterface> extends RemoteCallbackList<T> { 3194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 3204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani @Override 3214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public void onCallbackDied(T callback, Object cookie) { 3224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani checkCallbackCount(); 3234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3244f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 3254f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani} 326