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