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