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