1390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick/*
2390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
3390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
4390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * you may not use this file except in compliance with the License.
6390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * You may obtain a copy of the License at
7390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
8390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
10390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
11390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * See the License for the specific language governing permissions and
14390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * limitations under the License.
15390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick */
16390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
17390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickpackage android.app;
18390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.DrawableRes;
20ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viveretteimport android.annotation.NonNull;
21ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viveretteimport android.annotation.Nullable;
227b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.StringRes;
237b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.XmlRes;
24f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onukiimport android.app.admin.DevicePolicyManager;
25390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.ComponentName;
26390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.ContentResolver;
27390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.Intent;
28390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.IntentFilter;
29390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.IntentSender;
30390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ActivityInfo;
31390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ApplicationInfo;
32390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ComponentInfo;
332acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganovimport android.content.pm.EphemeralApplicationInfo;
34390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.FeatureInfo;
35f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslavimport android.content.pm.IOnPermissionsChangeListener;
36390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageDataObserver;
37390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageDeleteObserver;
38390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageInstallObserver;
39390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageManager;
40390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageMoveObserver;
41390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageStatsObserver;
42390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.InstrumentationInfo;
431c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglioimport android.content.pm.IntentFilterVerificationInfo;
449d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashmanimport android.content.pm.KeySet;
45390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PackageInfo;
463a44f3f1b446315ef894e01d2ab9b5388c2bd8c4Jeff Sharkeyimport android.content.pm.PackageInstaller;
477f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevotimport android.content.pm.PackageItemInfo;
48390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PackageManager;
49e6cd0c747e76723bc51a23925c239ae10f9d3b5cKenny Rootimport android.content.pm.ParceledListSlice;
50390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PermissionGroupInfo;
51390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PermissionInfo;
52390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ProviderInfo;
53390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ResolveInfo;
54390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ServiceInfo;
55c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslavimport android.content.pm.UserInfo;
560aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity;
57390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.res.Resources;
58390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.res.XmlResourceParser;
59c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslavimport android.graphics.Bitmap;
60c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslavimport android.graphics.Canvas;
61c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslavimport android.graphics.Rect;
627f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevotimport android.graphics.drawable.BitmapDrawable;
63390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.graphics.drawable.Drawable;
64390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.net.Uri;
6550a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkeyimport android.os.Bundle;
66620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkeyimport android.os.Handler;
67620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkeyimport android.os.Looper;
68620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkeyimport android.os.Message;
69390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.os.Process;
70390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.os.RemoteException;
71b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkeyimport android.os.SystemProperties;
7267df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasaniimport android.os.UserHandle;
7388cc346d0602e0b173b5076cd0051120682da601Nicolas Prevotimport android.os.UserManager;
74e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkeyimport android.os.storage.StorageManager;
75e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkeyimport android.os.storage.VolumeInfo;
76f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedyimport android.provider.Settings;
77add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackbornimport android.util.ArrayMap;
78390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.util.Log;
79a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brownimport android.view.Display;
80b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey
81b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkeyimport dalvik.system.VMRuntime;
8216c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey
8316c8e3f49497b6046972ae650772f65768366be8Jeff Sharkeyimport com.android.internal.annotations.GuardedBy;
84b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkeyimport com.android.internal.os.SomeArgs;
859d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashmanimport com.android.internal.util.Preconditions;
8664d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghinaimport com.android.internal.util.UserIcons;
872acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganovimport libcore.util.EmptyArray;
8816c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey
89390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.lang.ref.WeakReference;
90390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.ArrayList;
912acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganovimport java.util.Collections;
92620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkeyimport java.util.Iterator;
93390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.List;
94f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslavimport java.util.Map;
95620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkeyimport java.util.Objects;
96390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
97cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki/** @hide */
98cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukipublic class ApplicationPackageManager extends PackageManager {
99390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final String TAG = "ApplicationPackageManager";
100390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final static boolean DEBUG_ICONS = false;
101390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1022acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    private static final int DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES = 16384; // 16KB
1032acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
104d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski    // Default flags to use with PackageManager when no flags are given.
105d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski    private final static int sDefaultFlags = PackageManager.GET_SHARED_LIBRARY_FILES;
106d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski
10716c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    private final Object mLock = new Object();
10816c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey
10916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    @GuardedBy("mLock")
11016c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    private UserManager mUserManager;
11116c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    @GuardedBy("mLock")
11216c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    private PackageInstaller mInstaller;
1137f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot
114620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    @GuardedBy("mDelegates")
115620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    private final ArrayList<MoveCallbackDelegate> mDelegates = new ArrayList<>();
116620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
117f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    @GuardedBy("mLock")
118f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    private String mPermissionsControllerPackageName;
119f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov
1207f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot    UserManager getUserManager() {
12116c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey        synchronized (mLock) {
12216c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            if (mUserManager == null) {
12316c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                mUserManager = UserManager.get(mContext);
12416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            }
12516c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            return mUserManager;
1267f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        }
1277f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot    }
1287f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot
129390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
130390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PackageInfo getPackageInfo(String packageName, int flags)
131390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1329a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot        return getPackageInfoAsUser(packageName, flags, mContext.getUserId());
1339a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    }
1349a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot
1359a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    @Override
1369a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    public PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId)
1379a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            throws NameNotFoundException {
138390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1399a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            PackageInfo pi = mPM.getPackageInfo(packageName, flags, userId);
140390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
141390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
142390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
143390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
144f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
145390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
146390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
147390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
148390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
149390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
150390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
151390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] currentToCanonicalPackageNames(String[] names) {
152390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
153390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.currentToCanonicalPackageNames(names);
154390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
155f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
156390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
157390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
158390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
159390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
160390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] canonicalToCurrentPackageNames(String[] names) {
161390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
162390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.canonicalToCurrentPackageNames(names);
163390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
164f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
165390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
166390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
167390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
168390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
169390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Intent getLaunchIntentForPackage(String packageName) {
170390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // First see if the package has an INFO activity; the existence of
171390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // such an activity is implied to be the desired front-door for the
172390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // overall package (such as if it has multiple launcher entries).
173390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
174390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intentToResolve.addCategory(Intent.CATEGORY_INFO);
175390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intentToResolve.setPackage(packageName);
176194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn        List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
177390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
178390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // Otherwise, try to find a main launcher activity.
179194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn        if (ris == null || ris.size() <= 0) {
180390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // reuse the intent instance
181390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.removeCategory(Intent.CATEGORY_INFO);
182390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
183390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.setPackage(packageName);
184194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn            ris = queryIntentActivities(intentToResolve, 0);
185390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
186194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn        if (ris == null || ris.size() <= 0) {
187390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return null;
188390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
189390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Intent intent = new Intent(intentToResolve);
190390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
191194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn        intent.setClassName(ris.get(0).activityInfo.packageName,
192194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn                ris.get(0).activityInfo.name);
193390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return intent;
194390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
195390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
196390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
197970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima    public Intent getLeanbackLaunchIntentForPackage(String packageName) {
198970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        // Try to find a main leanback_launcher activity.
199970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
200970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        intentToResolve.addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER);
201970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        intentToResolve.setPackage(packageName);
202970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
203970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima
204970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        if (ris == null || ris.size() <= 0) {
205970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima            return null;
206970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        }
207970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        Intent intent = new Intent(intentToResolve);
208970417c7d3e33ccbd6918e28d9bc5da24651f5b3Jose Lima        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
209194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn        intent.setClassName(ris.get(0).activityInfo.packageName,
210194157638ae59418b9d9cb4d73f7e285f59bc579Dianne Hackborn                ris.get(0).activityInfo.name);
211390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return intent;
212390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
213390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
214390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2158588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    public int[] getPackageGids(String packageName) throws NameNotFoundException {
2168588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey        return getPackageGids(packageName, 0);
2178588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    }
2188588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey
2198588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    @Override
2208588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    public int[] getPackageGids(String packageName, int flags)
221390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
222390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
223cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey            int[] gids = mPM.getPackageGids(packageName, flags, mContext.getUserId());
224c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav            if (gids != null) {
225390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return gids;
226390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
227390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
228f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
229390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
230390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
231390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
232390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
233390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
234390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2358588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    public int getPackageUid(String packageName, int flags) throws NameNotFoundException {
2368588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey        return getPackageUidAsUser(packageName, flags, mContext.getUserId());
2378588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    }
2388588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey
2398588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    @Override
2408588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    public int getPackageUidAsUser(String packageName, int userId) throws NameNotFoundException {
2418588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey        return getPackageUidAsUser(packageName, 0, userId);
2428588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    }
2438588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey
2448588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    @Override
2458588bc1ef1f020bbe4a24d46874f675708149a57Jeff Sharkey    public int getPackageUidAsUser(String packageName, int flags, int userId)
246a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            throws NameNotFoundException {
247a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
248cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey            int uid = mPM.getPackageUid(packageName, flags, userId);
249a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (uid >= 0) {
250a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                return uid;
251a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
252a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
253f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
254a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
255a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
256a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        throw new NameNotFoundException(packageName);
257a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
258a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
259a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    @Override
260390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PermissionInfo getPermissionInfo(String name, int flags)
261390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
262390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
263390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            PermissionInfo pi = mPM.getPermissionInfo(name, flags);
264390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
265390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
266390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
267390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
268f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
269390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
270390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
271390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(name);
272390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
273390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
274390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
275b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
276390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PermissionInfo> queryPermissionsByGroup(String group, int flags)
277390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
278390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
279b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<PermissionInfo> parceledList =
280b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryPermissionsByGroup(group, flags);
281b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList != null) {
282b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                List<PermissionInfo> pi = parceledList.getList();
283b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                if (pi != null) {
284b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    return pi;
285b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                }
286390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
287390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
288f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
289390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
290390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
291390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(group);
292390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
293390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
294390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2957b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin    public boolean isPermissionReviewModeEnabled() {
2967b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin        return mContext.getResources().getBoolean(
2977b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin                com.android.internal.R.bool.config_permissionReviewRequired);
2987b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin    }
2997b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin
3007b89a7b1f7c208eaac19290b34c5f505a9fd5ebaPaul Navin    @Override
301390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PermissionGroupInfo getPermissionGroupInfo(String name,
302b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            int flags) throws NameNotFoundException {
303390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
304390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags);
305390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pgi != null) {
306390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pgi;
307390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
308390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
309f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
310390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
311390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
312390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(name);
313390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
314390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
315390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
316b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
317390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
318390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
319b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<PermissionGroupInfo> parceledList =
320b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getAllPermissionGroups(flags);
321b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
322b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
323b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
324b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
325390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
326f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
327390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
328390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
329390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
330390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
331390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ApplicationInfo getApplicationInfo(String packageName, int flags)
332390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
333cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey        return getApplicationInfoAsUser(packageName, flags, mContext.getUserId());
334cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    }
335cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey
336cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    @Override
337cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId)
338cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey            throws NameNotFoundException {
339390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
340cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey            ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, userId);
341390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
342caa711929416b12373d402b9dadb4367129daf87Narayan Kamath                // This is a temporary hack. Callers must use
343caa711929416b12373d402b9dadb4367129daf87Narayan Kamath                // createPackageContext(packageName).getApplicationInfo() to
344caa711929416b12373d402b9dadb4367129daf87Narayan Kamath                // get the right paths.
345c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai                return maybeAdjustApplicationInfo(ai);
346390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
347390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
348f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
349390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
350390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
351390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
352390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
353390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
354c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai    private static ApplicationInfo maybeAdjustApplicationInfo(ApplicationInfo info) {
355caa711929416b12373d402b9dadb4367129daf87Narayan Kamath        // If we're dealing with a multi-arch application that has both
356caa711929416b12373d402b9dadb4367129daf87Narayan Kamath        // 32 and 64 bit shared libraries, we might need to choose the secondary
357caa711929416b12373d402b9dadb4367129daf87Narayan Kamath        // depending on what the current runtime's instruction set is.
358caa711929416b12373d402b9dadb4367129daf87Narayan Kamath        if (info.primaryCpuAbi != null && info.secondaryCpuAbi != null) {
359caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet();
3604741cd92d1a34d5e7a86b645498df00865f6c651jgu
3614741cd92d1a34d5e7a86b645498df00865f6c651jgu            // Get the instruction set that the libraries of secondary Abi is supported.
3624741cd92d1a34d5e7a86b645498df00865f6c651jgu            // In presence of a native bridge this might be different than the one secondary Abi used.
3634741cd92d1a34d5e7a86b645498df00865f6c651jgu            String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi);
3644741cd92d1a34d5e7a86b645498df00865f6c651jgu            final String secondaryDexCodeIsa = SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa);
3654741cd92d1a34d5e7a86b645498df00865f6c651jgu            secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;
366caa711929416b12373d402b9dadb4367129daf87Narayan Kamath
367caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            // If the runtimeIsa is the same as the primary isa, then we do nothing.
368caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            // Everything will be set up correctly because info.nativeLibraryDir will
369caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            // correspond to the right ISA.
370caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            if (runtimeIsa.equals(secondaryIsa)) {
371c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai                ApplicationInfo modified = new ApplicationInfo(info);
372c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai                modified.nativeLibraryDir = info.secondaryNativeLibraryDir;
373c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai                return modified;
374caa711929416b12373d402b9dadb4367129daf87Narayan Kamath            }
375caa711929416b12373d402b9dadb4367129daf87Narayan Kamath        }
376c9a0237f5f49f2ffa52affb1bfd3e190b2267f22Tao Bai        return info;
377caa711929416b12373d402b9dadb4367129daf87Narayan Kamath    }
378caa711929416b12373d402b9dadb4367129daf87Narayan Kamath
379390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
380390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ActivityInfo getActivityInfo(ComponentName className, int flags)
381390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
382390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
383ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            ActivityInfo ai = mPM.getActivityInfo(className, flags, mContext.getUserId());
384390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
385390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ai;
386390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
387390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
388f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
389390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
390390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
391390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
392390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
393390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
394390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
395390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ActivityInfo getReceiverInfo(ComponentName className, int flags)
396390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
397390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
398ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            ActivityInfo ai = mPM.getReceiverInfo(className, flags, mContext.getUserId());
399390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
400390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ai;
401390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
402390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
403f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
404390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
405390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
406390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
407390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
408390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
409390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
410390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ServiceInfo getServiceInfo(ComponentName className, int flags)
411390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
412390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
413ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            ServiceInfo si = mPM.getServiceInfo(className, flags, mContext.getUserId());
414390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (si != null) {
415390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return si;
416390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
417390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
418f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
419390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
420390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
421390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
422390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
423390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
424390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
425390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ProviderInfo getProviderInfo(ComponentName className, int flags)
426390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
427390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
428ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            ProviderInfo pi = mPM.getProviderInfo(className, flags, mContext.getUserId());
429390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
430390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
431390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
432390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
433f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
434390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
435390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
436390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
437390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
438390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
439390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
440390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] getSystemSharedLibraryNames() {
441390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
442390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getSystemSharedLibraryNames();
443390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
444f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
445390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
446390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
447390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
448d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov    /** @hide */
449d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov    @Override
450a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    public @NonNull String getServicesSystemSharedLibraryPackageName() {
451d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov        try {
452d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov            return mPM.getServicesSystemSharedLibraryPackageName();
453d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov        } catch (RemoteException e) {
454f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
455d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov        }
456d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov    }
457d7b1f41109abee60ec8529369a85d84300b1d678Svet Ganov
458a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    /**
459a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov     * @hide
460a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov     */
461a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    public @NonNull String getSharedSystemSharedLibraryPackageName() {
462a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        try {
463a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov            return mPM.getSharedSystemSharedLibraryPackageName();
464a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        } catch (RemoteException e) {
465a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov            throw e.rethrowFromSystemServer();
466a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        }
467a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    }
468a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov
469390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
470b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
471390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public FeatureInfo[] getSystemAvailableFeatures() {
472390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
473b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<FeatureInfo> parceledList =
474b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getSystemAvailableFeatures();
475b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
476b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return new FeatureInfo[0];
477b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
478b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            final List<FeatureInfo> list = parceledList.getList();
479d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey            final FeatureInfo[] res = new FeatureInfo[list.size()];
480d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey            for (int i = 0; i < res.length; i++) {
481d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey                res[i] = list.get(i);
482d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey            }
483d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey            return res;
484390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
485f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
486390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
487390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
488390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
489390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
490390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean hasSystemFeature(String name) {
491115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey        return hasSystemFeature(name, 0);
492115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey    }
493115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey
494115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey    @Override
495115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey    public boolean hasSystemFeature(String name, int version) {
496390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
497115d2c189a46f535778d9dd0923f703ff2f888feJeff Sharkey            return mPM.hasSystemFeature(name, version);
498390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
499f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
500390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
501390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
502390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
503390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
504390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkPermission(String permName, String pkgName) {
505390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
506c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav            return mPM.checkPermission(permName, pkgName, mContext.getUserId());
507390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
508f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
509390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
510390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
511390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
512390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
513ad3b2975574f916c14382628d50c710a78064746Svet Ganov    public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
514ad3b2975574f916c14382628d50c710a78064746Svet Ganov        try {
515ad3b2975574f916c14382628d50c710a78064746Svet Ganov            return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
516ad3b2975574f916c14382628d50c710a78064746Svet Ganov        } catch (RemoteException e) {
517f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
518ad3b2975574f916c14382628d50c710a78064746Svet Ganov        }
519ad3b2975574f916c14382628d50c710a78064746Svet Ganov    }
520ad3b2975574f916c14382628d50c710a78064746Svet Ganov
521f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    /**
522f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov     * @hide
523f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov     */
524f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    @Override
525f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    public String getPermissionControllerPackageName() {
526f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov        synchronized (mLock) {
527f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov            if (mPermissionsControllerPackageName == null) {
528f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov                try {
529f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov                    mPermissionsControllerPackageName = mPM.getPermissionControllerPackageName();
530f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov                } catch (RemoteException e) {
531f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                    throw e.rethrowFromSystemServer();
532f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov                }
533f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov            }
534f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov            return mPermissionsControllerPackageName;
535f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov        }
536f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov    }
537f1b7f20bb839c96e8254ccb65398135f10fd45d9Svet Ganov
538ad3b2975574f916c14382628d50c710a78064746Svet Ganov    @Override
539390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean addPermission(PermissionInfo info) {
540390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
541390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.addPermission(info);
542390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
543f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
544390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
545390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
546390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
547390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
548390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean addPermissionAsync(PermissionInfo info) {
549390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
550390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.addPermissionAsync(info);
551390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
552f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
553390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
554390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
555390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
556390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
557390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void removePermission(String name) {
558390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
559390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.removePermission(name);
560390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
561f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
562390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
563390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
564390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
565390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
5668c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    public void grantRuntimePermission(String packageName, String permissionName,
5678c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            UserHandle user) {
568e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        try {
5698c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            mPM.grantRuntimePermission(packageName, permissionName, user.getIdentifier());
570e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        } catch (RemoteException e) {
571f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
572e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
573e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    }
574e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
575e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    @Override
5768c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    public void revokeRuntimePermission(String packageName, String permissionName,
5778c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            UserHandle user) {
578e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        try {
5798c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            mPM.revokeRuntimePermission(packageName, permissionName, user.getIdentifier());
5808c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        } catch (RemoteException e) {
581f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
5828c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        }
5838c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    }
5848c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov
5858c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    @Override
5868c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    public int getPermissionFlags(String permissionName, String packageName, UserHandle user) {
5878c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        try {
5888c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            return mPM.getPermissionFlags(permissionName, packageName, user.getIdentifier());
5898c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        } catch (RemoteException e) {
590f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
5918c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        }
5928c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    }
5938c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov
5948c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    @Override
5958c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov    public void updatePermissionFlags(String permissionName, String packageName,
5968c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            int flagMask, int flagValues, UserHandle user) {
5978c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov        try {
5988c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov            mPM.updatePermissionFlags(permissionName, packageName, flagMask,
5998c7f700a59ad26e75c9791335d78f14322cad49aSvet Ganov                    flagValues, user.getIdentifier());
600e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        } catch (RemoteException e) {
601f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
602e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
603e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    }
604e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
605e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    @Override
60620770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav    public boolean shouldShowRequestPermissionRationale(String permission) {
60720770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav        try {
60820770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav            return mPM.shouldShowRequestPermissionRationale(permission,
60920770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav                    mContext.getPackageName(), mContext.getUserId());
61020770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav        } catch (RemoteException e) {
611f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
61220770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav        }
61320770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav    }
61420770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav
61520770ddbd4d6f2af0093f36462a8f44a678b084bSvetoslav    @Override
616390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkSignatures(String pkg1, String pkg2) {
617390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
618390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.checkSignatures(pkg1, pkg2);
619390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
620f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
621390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
622390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
623390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
624390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
625390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkSignatures(int uid1, int uid2) {
626390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
627390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.checkUidSignatures(uid1, uid2);
628390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
629f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
630390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
631390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
632390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
633390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
634390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] getPackagesForUid(int uid) {
635390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
636390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getPackagesForUid(uid);
637390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
638f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
639390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
640390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
641390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
642390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
643390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String getNameForUid(int uid) {
644390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
645390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getNameForUid(uid);
646390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
647f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
648390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
649390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
650390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
651390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
652390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getUidForSharedUser(String sharedUserName)
653390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
654390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
655390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            int uid = mPM.getUidForSharedUser(sharedUserName);
656390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if(uid != -1) {
657390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return uid;
658390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
659390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
660f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
661390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
662390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
663390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
664390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
665e6cd0c747e76723bc51a23925c239ae10f9d3b5cKenny Root    @SuppressWarnings("unchecked")
666390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
667390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PackageInfo> getInstalledPackages(int flags) {
668e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey        return getInstalledPackagesAsUser(flags, mContext.getUserId());
669151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    }
670151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani
671151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    /** @hide */
672151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    @Override
673b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
674e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
675390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
676b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<PackageInfo> parceledList =
677b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getInstalledPackages(flags, userId);
678b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
679b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
680b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
681b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
682390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
683f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
684390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
685390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
686390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
687e6cd0c747e76723bc51a23925c239ae10f9d3b5cKenny Root    @SuppressWarnings("unchecked")
688390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
689e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn    public List<PackageInfo> getPackagesHoldingPermissions(
690e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn            String[] permissions, int flags) {
691e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn        final int userId = mContext.getUserId();
692e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn        try {
693b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<PackageInfo> parceledList =
694b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getPackagesHoldingPermissions(permissions, flags, userId);
695b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
696b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
697b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
698b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
699e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn        } catch (RemoteException e) {
700f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
701e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn        }
702e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn    }
703e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn
704e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn    @SuppressWarnings("unchecked")
705e799175b6ba3aadd972f4b861758d675d1f93987Dianne Hackborn    @Override
706390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ApplicationInfo> getInstalledApplications(int flags) {
707ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        final int userId = mContext.getUserId();
708390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
709b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ApplicationInfo> parceledList =
710b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getInstalledApplications(flags, userId);
711b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
712b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
713b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
714b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
715390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
716f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
717390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
718390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
719390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
7202acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    /** @hide */
7212acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @SuppressWarnings("unchecked")
7222acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7232acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public List<EphemeralApplicationInfo> getEphemeralApplications() {
7242acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        try {
7252acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            ParceledListSlice<EphemeralApplicationInfo> slice =
7262acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                    mPM.getEphemeralApplications(mContext.getUserId());
7272acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            if (slice != null) {
7282acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                return slice.getList();
7292acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            }
7302acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            return Collections.emptyList();
7312acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        } catch (RemoteException e) {
732f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
7332acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        }
7342acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7352acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
7362acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    /** @hide */
7372acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7382acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public Drawable getEphemeralApplicationIcon(String packageName) {
7392acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        try {
7402acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            Bitmap bitmap = mPM.getEphemeralApplicationIcon(
7412acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                    packageName, mContext.getUserId());
7422acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            if (bitmap != null) {
7432acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                return new BitmapDrawable(null, bitmap);
7442acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            }
7452acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            return null;
7462acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        } catch (RemoteException e) {
747f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
7482acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        }
7492acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7502acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
7512acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7522acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public boolean isEphemeralApplication() {
7532acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        try {
7542acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            return mPM.isEphemeralApplication(
7552acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                    mContext.getPackageName(), mContext.getUserId());
7562acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        } catch (RemoteException e) {
757f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
7582acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        }
7592acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7602acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
7612acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7622acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public int getEphemeralCookieMaxSizeBytes() {
7632acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        return Settings.Global.getInt(mContext.getContentResolver(),
7642acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                Settings.Global.EPHEMERAL_COOKIE_MAX_SIZE_BYTES,
7652acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES);
7662acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7672acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
7682acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7692acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public @NonNull byte[] getEphemeralCookie() {
7702acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        try {
7712acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            final byte[] cookie = mPM.getEphemeralApplicationCookie(
7722acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                    mContext.getPackageName(), mContext.getUserId());
7732acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            if (cookie != null) {
7742acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                return cookie;
77527b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey            } else {
77627b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey                return EmptyArray.BYTE;
7772acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            }
7782acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        } catch (RemoteException e) {
779f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
7802acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        }
7812acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7822acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
7832acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    @Override
7842acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    public boolean setEphemeralCookie(@NonNull  byte[] cookie) {
7852acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        try {
7862acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov            return mPM.setEphemeralApplicationCookie(
7872acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov                    mContext.getPackageName(), cookie, mContext.getUserId());
7882acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        } catch (RemoteException e) {
789f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
7902acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov        }
7912acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov    }
7922acf063da08dfff69f184c9a6a90a7a5fe60d818Svet Ganov
793390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
794390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ResolveInfo resolveActivity(Intent intent, int flags) {
795ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return resolveActivityAsUser(intent, flags, mContext.getUserId());
79658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    }
79758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov
79858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    @Override
79958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
800390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
801390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.resolveIntent(
802390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
803390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
80458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                flags,
80558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                userId);
806390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
807f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
808390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
809390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
810390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
811390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
812390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryIntentActivities(Intent intent,
813390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                   int flags) {
814ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return queryIntentActivitiesAsUser(intent, flags, mContext.getUserId());
815151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    }
816151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani
817151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    /** @hide Same as above but for a specific user */
818151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    @Override
819b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
82058d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
821b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            int flags, int userId) {
822b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov        try {
823b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ResolveInfo> parceledList =
824b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryIntentActivities(intent,
825b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            intent.resolveTypeIfNeeded(mContext.getContentResolver()),
826b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            flags, userId);
827b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
828b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
829b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
830b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
831390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
832f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
833390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
834390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
835390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
836390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
837b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
838390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryIntentActivityOptions(
839390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ComponentName caller, Intent[] specifics, Intent intent,
840390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        int flags) {
841390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final ContentResolver resolver = mContext.getContentResolver();
842390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
843390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        String[] specificTypes = null;
844390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (specifics != null) {
845390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            final int N = specifics.length;
846390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            for (int i=0; i<N; i++) {
847390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                Intent sp = specifics[i];
848390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (sp != null) {
849390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    String t = sp.resolveTypeIfNeeded(resolver);
850390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    if (t != null) {
851390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        if (specificTypes == null) {
852390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            specificTypes = new String[N];
853390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
854390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        specificTypes[i] = t;
855390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
856390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
857390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
858390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
859390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
860390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
861b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ResolveInfo> parceledList =
862b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryIntentActivityOptions(caller, specifics, specificTypes, intent,
863b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    intent.resolveTypeIfNeeded(resolver), flags, mContext.getUserId());
864b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
865b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
866b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
867b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
868390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
869f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
870390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
871390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
872390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
873f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani    /**
874f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani     * @hide
875f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani     */
876390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
877b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
878e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) {
879390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
880b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ResolveInfo> parceledList =
881b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryIntentReceivers(intent,
882b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            intent.resolveTypeIfNeeded(mContext.getContentResolver()),
883b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            flags,  userId);
884b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
885b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
886b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
887b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
888390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
889f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
890390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
891390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
892390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
893390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
894f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani    public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
895e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey        return queryBroadcastReceiversAsUser(intent, flags, mContext.getUserId());
896f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani    }
897f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani
898f203aeef993b0f4ce65c9630d06bbd50a504e89fAmith Yamasani    @Override
899390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ResolveInfo resolveService(Intent intent, int flags) {
900390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
901390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.resolveService(
902390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
903390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
904483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                flags,
905ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                mContext.getUserId());
906390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
907f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
908390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
909390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
910390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
911390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
912b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
91358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
914390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
915b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ResolveInfo> parceledList =
916b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryIntentServices(intent,
917b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
918b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    flags, userId);
919b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
920b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
921b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
922b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
923390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
924f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
925390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
926390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
927390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
928390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
92958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
930ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        return queryIntentServicesAsUser(intent, flags, mContext.getUserId());
93158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    }
93258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov
93358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov    @Override
934b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
93585f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    public List<ResolveInfo> queryIntentContentProvidersAsUser(
93685f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey            Intent intent, int flags, int userId) {
93785f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey        try {
938b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ResolveInfo> parceledList =
939b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryIntentContentProviders(intent,
940b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            intent.resolveTypeIfNeeded(mContext.getContentResolver()),
941b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                            flags, userId);
942b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
943b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
944b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
945b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
94685f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey        } catch (RemoteException e) {
947f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
94885f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey        }
94985f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    }
95085f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey
95185f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    @Override
95285f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
95385f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey        return queryIntentContentProvidersAsUser(intent, flags, mContext.getUserId());
95485f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    }
95585f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey
95685f5f8132015d8a5043ea4413702420d0d157c9fJeff Sharkey    @Override
9570363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina    public ProviderInfo resolveContentProvider(String name, int flags) {
9580363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina        return resolveContentProviderAsUser(name, flags, mContext.getUserId());
9590363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina    }
9600363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina
9610363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina    /** @hide **/
9620363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina    @Override
9630363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina    public ProviderInfo resolveContentProviderAsUser(String name, int flags, int userId) {
964390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
9650363c3eb089afd4474bfd6ae6ee8a500d6e97614Alexandra Gherghina            return mPM.resolveContentProvider(name, flags, userId);
966390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
967f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
968390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
969390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
970390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
971390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
972b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
973390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ProviderInfo> queryContentProviders(String processName,
974b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            int uid, int flags) {
975390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
976b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<ProviderInfo> slice =
977b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryContentProviders(processName, uid, flags);
978b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return slice != null ? slice.getList() : Collections.<ProviderInfo>emptyList();
979390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
980f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
981390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
982390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
983390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
984390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
985390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public InstrumentationInfo getInstrumentationInfo(
986390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ComponentName className, int flags)
987390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
988390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
989390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            InstrumentationInfo ii = mPM.getInstrumentationInfo(
990390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                className, flags);
991390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ii != null) {
992390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ii;
993390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
994390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
995f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
996390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
997390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
998390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
999390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1000390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1001390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1002b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
1003390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<InstrumentationInfo> queryInstrumentation(
1004390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        String targetPackage, int flags) {
1005390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1006b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<InstrumentationInfo> parceledList =
1007b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.queryInstrumentation(targetPackage, flags);
1008b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
1009b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
1010b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
1011b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
1012390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1013f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1014390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1015390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1016390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1017ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Nullable
1018ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Override
1019ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    public Drawable getDrawable(String packageName, @DrawableRes int resId,
1020ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            @Nullable ApplicationInfo appInfo) {
1021ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette        final ResourceName name = new ResourceName(packageName, resId);
1022ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette        final Drawable cachedIcon = getCachedIcon(name);
1023ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette        if (cachedIcon != null) {
1024ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            return cachedIcon;
1025390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1026ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette
1027390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
1028390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
1029d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski                appInfo = getApplicationInfo(packageName, sDefaultFlags);
1030390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
1031390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
1032390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1033390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1034ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette
1035ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette        if (resId != 0) {
1036ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            try {
1037ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                final Resources r = getResourcesForApplication(appInfo);
1038ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                final Drawable dr = r.getDrawable(resId, null);
1039ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                if (dr != null) {
1040ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                    putCachedIcon(name, dr);
1041ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                }
1042ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette
1043ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                if (false) {
1044ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                    RuntimeException e = new RuntimeException("here");
1045ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                    e.fillInStackTrace();
1046ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                    Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resId)
1047ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                                    + " from package " + packageName
1048ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                                    + ": app scale=" + r.getCompatibilityInfo().applicationScale
1049ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                                    + ", caller scale=" + mContext.getResources()
1050ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                                    .getCompatibilityInfo().applicationScale,
1051ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                            e);
1052ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                }
10533ce4625ac6d8a0ffdc50675406e98c0ad904d96aRicky Wai                if (DEBUG_ICONS) {
1054ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                    Log.v(TAG, "Getting drawable 0x"
1055ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                            + Integer.toHexString(resId) + " from " + r
1056ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                            + ": " + dr);
10573ce4625ac6d8a0ffdc50675406e98c0ad904d96aRicky Wai                }
10583ce4625ac6d8a0ffdc50675406e98c0ad904d96aRicky Wai                return dr;
1059ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            } catch (NameNotFoundException e) {
1060ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                Log.w("PackageManager", "Failure retrieving resources for "
1061ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                        + appInfo.packageName);
1062ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            } catch (Resources.NotFoundException e) {
1063ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                Log.w("PackageManager", "Failure retrieving resources for "
1064ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                        + appInfo.packageName + ": " + e.getMessage());
1065ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            } catch (Exception e) {
1066ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                // If an exception was thrown, fall through to return
1067ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                // default icon.
1068ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                Log.w("PackageManager", "Failure retrieving icon 0x"
1069ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                        + Integer.toHexString(resId) + " in package "
1070ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                        + packageName, e);
1071390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1072390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1073ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette
1074390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
1075390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1076390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1077390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getActivityIcon(ComponentName activityName)
1078390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1079d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getActivityInfo(activityName, sDefaultFlags).loadIcon(this);
1080390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1081390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1082390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getActivityIcon(Intent intent)
1083390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1084390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (intent.getComponent() != null) {
1085390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return getActivityIcon(intent.getComponent());
1086390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1087390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1088390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResolveInfo info = resolveActivity(
1089390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intent, PackageManager.MATCH_DEFAULT_ONLY);
1090390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (info != null) {
1091390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return info.activityInfo.loadIcon(this);
1092390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1093390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
109439fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy        throw new NameNotFoundException(intent.toUri(0));
1095390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1096390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1097390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getDefaultActivityIcon() {
1098390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return Resources.getSystem().getDrawable(
1099390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            com.android.internal.R.drawable.sym_def_app_icon);
1100390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1101390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1102390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getApplicationIcon(ApplicationInfo info) {
1103390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadIcon(this);
1104390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1105390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1106390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getApplicationIcon(String packageName)
1107390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1108d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getApplicationIcon(getApplicationInfo(packageName, sDefaultFlags));
1109390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1110390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1111390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1112f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public Drawable getActivityBanner(ComponentName activityName)
1113f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            throws NameNotFoundException {
1114d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getActivityInfo(activityName, sDefaultFlags).loadBanner(this);
1115f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
1116f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1117f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    @Override
1118f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public Drawable getActivityBanner(Intent intent)
1119f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            throws NameNotFoundException {
1120f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        if (intent.getComponent() != null) {
1121f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            return getActivityBanner(intent.getComponent());
1122f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        }
1123f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1124f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        ResolveInfo info = resolveActivity(
1125f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima                intent, PackageManager.MATCH_DEFAULT_ONLY);
1126f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        if (info != null) {
1127f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            return info.activityInfo.loadBanner(this);
1128f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        }
1129f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1130f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        throw new NameNotFoundException(intent.toUri(0));
1131f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
1132f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1133f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    @Override
1134f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public Drawable getApplicationBanner(ApplicationInfo info) {
1135f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        return info.loadBanner(this);
1136f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
1137f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1138f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    @Override
1139f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public Drawable getApplicationBanner(String packageName)
1140f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            throws NameNotFoundException {
1141d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getApplicationBanner(getApplicationInfo(packageName, sDefaultFlags));
1142f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
1143f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1144f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    @Override
1145390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getActivityLogo(ComponentName activityName)
1146390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1147d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getActivityInfo(activityName, sDefaultFlags).loadLogo(this);
1148390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1149390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1150390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1151390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getActivityLogo(Intent intent)
1152390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1153390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (intent.getComponent() != null) {
1154390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return getActivityLogo(intent.getComponent());
1155390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1156390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1157390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResolveInfo info = resolveActivity(
1158390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intent, PackageManager.MATCH_DEFAULT_ONLY);
1159390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (info != null) {
1160390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return info.activityInfo.loadLogo(this);
1161390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1162390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1163390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(intent.toUri(0));
1164390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1165390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1166390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1167390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getApplicationLogo(ApplicationInfo info) {
1168390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadLogo(this);
1169390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1170390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1171390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1172390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getApplicationLogo(String packageName)
1173390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
1174d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski        return getApplicationLogo(getApplicationInfo(packageName, sDefaultFlags));
1175390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1176390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1177c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    @Override
117866ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    public Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
117966ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev            int badgeDensity) {
118066ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        Drawable badgeDrawable = getDrawableForDensity(
118166ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev            com.android.internal.R.drawable.ic_corp_badge, badgeDensity);
118266ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        return getBadgedDrawable(drawable, badgeDrawable, badgeLocation, true);
118366ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    }
118466ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev
118566ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    @Override
1186c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
1187c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        final int badgeResId = getBadgeResIdForUser(user.getIdentifier());
1188c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (badgeResId == 0) {
1189c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            return icon;
1190c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
1191c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        Drawable badgeIcon = getDrawable("system", badgeResId, null);
1192c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return getBadgedDrawable(icon, badgeIcon, null, true);
1193c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
1194c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
1195c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    @Override
1196c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    public Drawable getUserBadgedDrawableForDensity(Drawable drawable, UserHandle user,
1197c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            Rect badgeLocation, int badgeDensity) {
1198c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        Drawable badgeDrawable = getUserBadgeForDensity(user, badgeDensity);
1199c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (badgeDrawable == null) {
1200c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            return drawable;
1201c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
1202c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return getBadgedDrawable(drawable, badgeDrawable, badgeLocation, true);
1203c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
1204c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
1205c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    @Override
1206c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    public Drawable getUserBadgeForDensity(UserHandle user, int density) {
120766ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        return getManagedProfileIconForDensity(user, com.android.internal.R.drawable.ic_corp_badge,
120866ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev                density);
1209e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek    }
1210e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek
1211e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek    @Override
1212e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek    public Drawable getUserBadgeForDensityNoBackground(UserHandle user, int density) {
121366ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        return getManagedProfileIconForDensity(user,
121466ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev                com.android.internal.R.drawable.ic_corp_badge_no_background, density);
1215e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek    }
1216e6ff946cd4f40a0d4f3de51b6554e07b8d3cee93Selim Cinek
121766ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    private Drawable getDrawableForDensity(int drawableId, int density) {
121866ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        if (density <= 0) {
121966ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev            density = mContext.getResources().getDisplayMetrics().densityDpi;
122066ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        }
122166ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev        return Resources.getSystem().getDrawableForDensity(drawableId, density);
122266ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    }
122366ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev
122466ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev    private Drawable getManagedProfileIconForDensity(UserHandle user, int drawableId, int density) {
12258673b2899e775014336efff44ea88dcac2b25bddTony Mak        if (isManagedProfile(user.getIdentifier())) {
122666ae66a7f74ee835807a141a216afbb254664510Vadim Tryshev            return getDrawableForDensity(drawableId, density);
1227c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
1228c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return null;
1229c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
1230c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
1231c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    @Override
1232c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) {
12338673b2899e775014336efff44ea88dcac2b25bddTony Mak        if (isManagedProfile(user.getIdentifier())) {
1234c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            return Resources.getSystem().getString(
1235c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                    com.android.internal.R.string.managed_profile_label_badge, label);
1236c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
1237c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return label;
1238c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
1239c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
1240ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Override
1241ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    public Resources getResourcesForActivity(ComponentName activityName)
1242ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            throws NameNotFoundException {
1243390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getResourcesForApplication(
1244d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski            getActivityInfo(activityName, sDefaultFlags).applicationInfo);
1245390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1246390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1247ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Override
1248ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    public Resources getResourcesForApplication(@NonNull ApplicationInfo app)
1249ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            throws NameNotFoundException {
1250390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (app.packageName.equals("system")) {
1251390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mContext.mMainThread.getSystemContext().getResources();
1252390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
12538a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey        final boolean sameUid = (app.uid == Process.myUid());
125453fafdfbe76d3eeb0fe6782873a03869167a65b0Adam Lesinski        final Resources r = mContext.mMainThread.getTopLevelResources(
1255c82f28a91370a2b01d36e35ca149a3da58b38f60Adam Lesinski                    sameUid ? app.sourceDir : app.publicSourceDir,
1256c82f28a91370a2b01d36e35ca149a3da58b38f60Adam Lesinski                    sameUid ? app.splitSourceDirs : app.splitPublicSourceDirs,
1257c82f28a91370a2b01d36e35ca149a3da58b38f60Adam Lesinski                    app.resourceDirs, app.sharedLibraryFiles, Display.DEFAULT_DISPLAY,
1258c82f28a91370a2b01d36e35ca149a3da58b38f60Adam Lesinski                    mContext.mPackageInfo);
125953fafdfbe76d3eeb0fe6782873a03869167a65b0Adam Lesinski        if (r != null) {
126053fafdfbe76d3eeb0fe6782873a03869167a65b0Adam Lesinski            return r;
1261c82f28a91370a2b01d36e35ca149a3da58b38f60Adam Lesinski        }
126253fafdfbe76d3eeb0fe6782873a03869167a65b0Adam Lesinski        throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
126353fafdfbe76d3eeb0fe6782873a03869167a65b0Adam Lesinski
1264390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1265390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1266ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Override
1267ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    public Resources getResourcesForApplication(String appPackageName)
1268ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            throws NameNotFoundException {
1269390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getResourcesForApplication(
1270d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski            getApplicationInfo(appPackageName, sDefaultFlags));
1271390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1272390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
127398edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani    /** @hide */
127498edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani    @Override
127598edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani    public Resources getResourcesForApplicationAsUser(String appPackageName, int userId)
127698edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani            throws NameNotFoundException {
1277ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        if (userId < 0) {
1278ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            throw new IllegalArgumentException(
1279ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey                    "Call does not support special user #" + userId);
1280ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        }
1281ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        if ("system".equals(appPackageName)) {
1282ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            return mContext.mMainThread.getSystemContext().getResources();
1283ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey        }
128498edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani        try {
1285d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski            ApplicationInfo ai = mPM.getApplicationInfo(appPackageName, sDefaultFlags, userId);
128698edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani            if (ai != null) {
128798edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani                return getResourcesForApplication(ai);
128898edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani            }
128998edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani        } catch (RemoteException e) {
1290f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
129198edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani        }
129298edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani        throw new NameNotFoundException("Package " + appPackageName + " doesn't exist");
129398edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani    }
129498edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani
1295cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    volatile int mCachedSafeMode = -1;
1296cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey
1297cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    @Override
1298cd65448ccd13c4c2d0fe9e9623fec3a898ab9372Jeff Sharkey    public boolean isSafeMode() {
1299390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1300390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (mCachedSafeMode < 0) {
1301390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                mCachedSafeMode = mPM.isSafeMode() ? 1 : 0;
1302390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1303390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mCachedSafeMode != 0;
1304390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1305f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1306390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1307390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1308390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1309f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    @Override
1310f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    public void addOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
1311f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        synchronized (mPermissionListeners) {
1312f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            if (mPermissionListeners.get(listener) != null) {
1313f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                return;
1314f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            }
1315f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            OnPermissionsChangeListenerDelegate delegate =
1316f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper());
1317f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            try {
1318f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                mPM.addOnPermissionsChangeListener(delegate);
1319f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                mPermissionListeners.put(listener, delegate);
1320f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            } catch (RemoteException e) {
1321f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                throw e.rethrowFromSystemServer();
1322f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            }
1323f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        }
1324f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    }
1325f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
1326f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    @Override
1327f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    public void removeOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
1328f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        synchronized (mPermissionListeners) {
1329f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener);
1330f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            if (delegate != null) {
1331f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                try {
1332f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    mPM.removeOnPermissionsChangeListener(delegate);
1333f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    mPermissionListeners.remove(listener);
1334f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                } catch (RemoteException e) {
1335f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                    throw e.rethrowFromSystemServer();
1336f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                }
1337f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            }
1338f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        }
1339f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    }
1340f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
1341390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    static void configurationChanged() {
1342390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
1343390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sIconCache.clear();
1344390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sStringCache.clear();
1345390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1346390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1347390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1348390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    ApplicationPackageManager(ContextImpl context,
1349390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                              IPackageManager pm) {
1350390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        mContext = context;
1351390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        mPM = pm;
1352390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1353390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1354ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    @Nullable
1355ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    private Drawable getCachedIcon(@NonNull ResourceName name) {
1356390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
1357ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            final WeakReference<Drawable.ConstantState> wr = sIconCache.get(name);
1358390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for "
1359390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   + name + ": " + wr);
1360390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (wr != null) {   // we have the activity
1361ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette                final Drawable.ConstantState state = wr.get();
136239fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                if (state != null) {
136339fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    if (DEBUG_ICONS) {
136439fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                        Log.v(TAG, "Get cached drawable state for " + name + ": " + state);
136539fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    }
136639fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    // Note: It's okay here to not use the newDrawable(Resources) variant
136739fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    //       of the API. The ConstantState comes from a drawable that was
136839fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    //       originally created by passing the proper app Resources instance
136939fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    //       which means the state should already contain the proper
137039fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    //       resources specific information (like density.) See
137139fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    //       BitmapDrawable.BitmapState for instance.
137239fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy                    return state.newDrawable();
1373390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
1374390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                // our entry has been purged
1375390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                sIconCache.remove(name);
1376390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1377390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1378390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
1379390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1380390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1381ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette    private void putCachedIcon(@NonNull ResourceName name, @NonNull Drawable dr) {
1382390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
1383ecd585a8fd2ae17479ae698193d5b04b602c5b70Alan Viverette            sIconCache.put(name, new WeakReference<>(dr.getConstantState()));
138439fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy            if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable state for " + name + ": " + dr);
1385390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1386390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1387390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
138839fe17c8fb764a9233182cc408e37b1a59182b00Romain Guy    static void handlePackageBroadcast(int cmd, String[] pkgList, boolean hasPkgInfo) {
1389390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        boolean immediateGc = false;
1390390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) {
1391390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            immediateGc = true;
1392390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1393390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (pkgList != null && (pkgList.length > 0)) {
1394390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            boolean needCleanup = false;
1395390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            for (String ssp : pkgList) {
1396390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                synchronized (sSync) {
1397add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                    for (int i=sIconCache.size()-1; i>=0; i--) {
1398add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                        ResourceName nm = sIconCache.keyAt(i);
1399add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                        if (nm.packageName.equals(ssp)) {
1400add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            //Log.i(TAG, "Removing cached drawable for " + nm);
1401add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            sIconCache.removeAt(i);
1402add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            needCleanup = true;
1403390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
1404390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
1405add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                    for (int i=sStringCache.size()-1; i>=0; i--) {
1406add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                        ResourceName nm = sStringCache.keyAt(i);
1407add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                        if (nm.packageName.equals(ssp)) {
1408add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            //Log.i(TAG, "Removing cached string for " + nm);
1409add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            sStringCache.removeAt(i);
1410add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn                            needCleanup = true;
1411390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
1412390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
1413390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
1414390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1415390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (needCleanup || hasPkgInfo) {
1416390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (immediateGc) {
1417390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    // Schedule an immediate gc.
1418390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    Runtime.getRuntime().gc();
1419390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                } else {
1420390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    ActivityThread.currentActivityThread().scheduleGcIdler();
1421390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
1422390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1423390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1424390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1425390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1426390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final class ResourceName {
1427390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final String packageName;
1428390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final int iconId;
1429390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1430390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(String _packageName, int _iconId) {
1431390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            packageName = _packageName;
1432390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            iconId = _iconId;
1433390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1434390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1435390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ApplicationInfo aInfo, int _iconId) {
1436390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(aInfo.packageName, _iconId);
1437390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1438390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1439390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ComponentInfo cInfo, int _iconId) {
1440390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(cInfo.applicationInfo.packageName, _iconId);
1441390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1442390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1443390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ResolveInfo rInfo, int _iconId) {
1444390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(rInfo.activityInfo.applicationInfo.packageName, _iconId);
1445390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1446390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1447390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
1448390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public boolean equals(Object o) {
1449390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (this == o) return true;
1450390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (o == null || getClass() != o.getClass()) return false;
1451390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1452390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ResourceName that = (ResourceName) o;
1453390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1454390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (iconId != that.iconId) return false;
1455390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return !(packageName != null ?
1456390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                     !packageName.equals(that.packageName) : that.packageName != null);
1457390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1458390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1459390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1460390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
1461390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public int hashCode() {
1462390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            int result;
1463390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            result = packageName.hashCode();
1464390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            result = 31 * result + iconId;
1465390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return result;
1466390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1467390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1468390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
1469390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public String toString() {
1470390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return "{ResourceName " + packageName + " / " + iconId + "}";
1471390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1472390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1473390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1474390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private CharSequence getCachedString(ResourceName name) {
1475390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
1476390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            WeakReference<CharSequence> wr = sStringCache.get(name);
1477390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (wr != null) {   // we have the activity
1478390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                CharSequence cs = wr.get();
1479390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (cs != null) {
1480390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    return cs;
1481390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
1482390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                // our entry has been purged
1483390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                sStringCache.remove(name);
1484390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1485390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1486390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
1487390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1488390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1489390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private void putCachedString(ResourceName name, CharSequence cs) {
1490390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
1491390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sStringCache.put(name, new WeakReference<CharSequence>(cs));
1492390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1493390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1494390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1495390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
14967b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public CharSequence getText(String packageName, @StringRes int resid,
1497390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                ApplicationInfo appInfo) {
1498390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName name = new ResourceName(packageName, resid);
1499390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        CharSequence text = getCachedString(name);
1500390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (text != null) {
1501390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return text;
1502390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1503390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
1504390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
1505d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski                appInfo = getApplicationInfo(packageName, sDefaultFlags);
1506390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
1507390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
1508390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1509390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1510390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1511390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Resources r = getResourcesForApplication(appInfo);
1512390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            text = r.getText(resid);
1513390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            putCachedString(name, text);
1514390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return text;
1515390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (NameNotFoundException e) {
1516aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            Log.w("PackageManager", "Failure retrieving resources for "
1517390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + appInfo.packageName);
1518390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RuntimeException e) {
1519390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // If an exception was thrown, fall through to return
1520390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // default icon.
1521390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving text 0x"
1522390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + Integer.toHexString(resid) + " in package "
1523390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + packageName, e);
1524390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1525390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
1526390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1527390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1528390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
15297b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye    public XmlResourceParser getXml(String packageName, @XmlRes int resid,
1530390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                    ApplicationInfo appInfo) {
1531390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
1532390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
1533d00bb5edcfc8ee5c2026f66785b703b388314b22Adam Lesinski                appInfo = getApplicationInfo(packageName, sDefaultFlags);
1534390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
1535390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
1536390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
1537390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1538390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1539390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Resources r = getResourcesForApplication(appInfo);
1540390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return r.getXml(resid);
1541390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RuntimeException e) {
1542390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // If an exception was thrown, fall through to return
1543390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // default icon.
1544390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving xml 0x"
1545390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + Integer.toHexString(resid) + " in package "
1546390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + packageName, e);
1547390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (NameNotFoundException e) {
15483fa51e3430e3bf902ae4f2d72dfb956103b6bd2dAlon Albert            Log.w("PackageManager", "Failure retrieving resources for "
1549390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + appInfo.packageName);
1550390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1551390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
1552390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1553390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1554390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1555390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public CharSequence getApplicationLabel(ApplicationInfo info) {
1556390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadLabel(this);
1557390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1558390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1559390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1560390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
1561390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                               String installerPackageName) {
1562513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey        installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
1563a67932374dbbfbe4c6440d223fc7922b313dd957Todd Kennedy                installerPackageName, mContext.getUserId());
1564f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate    }
1565f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate
1566f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate    @Override
1567f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate    public void installPackage(Uri packageURI, PackageInstallObserver observer,
1568f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate            int flags, String installerPackageName) {
1569a67932374dbbfbe4c6440d223fc7922b313dd957Todd Kennedy        installCommon(packageURI, observer, flags, installerPackageName, mContext.getUserId());
1570513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey    }
1571513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey
1572513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey    private void installCommon(Uri packageURI,
1573513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey            PackageInstallObserver observer, int flags, String installerPackageName,
15749a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            int userId) {
1575513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey        if (!"file".equals(packageURI.getScheme())) {
1576513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey            throw new UnsupportedOperationException("Only file:// URIs are supported");
1577513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey        }
1578513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey
1579513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey        final String originPath = packageURI.getPath();
1580f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate        try {
15819a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            mPM.installPackageAsUser(originPath, observer.getBinder(), flags, installerPackageName,
1582a67932374dbbfbe4c6440d223fc7922b313dd957Todd Kennedy                    userId);
158327b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey        } catch (RemoteException e) {
1584f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1585706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
1586706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
1587706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
1588706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
15899a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    public int installExistingPackage(String packageName) throws NameNotFoundException {
15900e27c87af691bc53d320496bbffa58752608608dRobin Lee        return installExistingPackageAsUser(packageName, mContext.getUserId());
15919a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    }
15929a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot
15939a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    @Override
15949a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    public int installExistingPackageAsUser(String packageName, int userId)
15957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            throws NameNotFoundException {
15967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        try {
15979a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            int res = mPM.installExistingPackageAsUser(packageName, userId);
15987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            if (res == INSTALL_FAILED_INVALID_URI) {
15997767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                throw new NameNotFoundException("Package " + packageName + " doesn't exist");
16007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            }
16017767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            return res;
16027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        } catch (RemoteException e) {
1603f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
16057767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
16067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
16077767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    @Override
16083a9b5fbb97e65019abec97f172b4cbf2100d1225Kenny Root    public void verifyPendingInstall(int id, int response) {
16095ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        try {
16103a9b5fbb97e65019abec97f172b4cbf2100d1225Kenny Root            mPM.verifyPendingInstall(id, response);
16115ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        } catch (RemoteException e) {
1612f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16135ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        }
16145ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root    }
16155ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root
16165ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root    @Override
1617d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings    public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
1618d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings            long millisecondsToDelay) {
1619d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings        try {
1620d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings            mPM.extendVerificationTimeout(id, verificationCodeAtTimeout, millisecondsToDelay);
1621d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings        } catch (RemoteException e) {
1622f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1623d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings        }
1624d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings    }
1625d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings
1626d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0crich cannings    @Override
1627dfa93abf2f64237007af8e72c4a4114a5258e858Todd Kennedy    public void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
16281c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        try {
1629dfa93abf2f64237007af8e72c4a4114a5258e858Todd Kennedy            mPM.verifyIntentFilter(id, verificationCode, failedDomains);
16301c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        } catch (RemoteException e) {
1631f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16321c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        }
16331c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    }
16341c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio
16351c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    @Override
1636e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public int getIntentVerificationStatusAsUser(String packageName, int userId) {
16371c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        try {
16381c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio            return mPM.getIntentVerificationStatus(packageName, userId);
16391c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        } catch (RemoteException e) {
1640f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16411c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        }
16421c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    }
16431c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio
16441c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    @Override
1645e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public boolean updateIntentVerificationStatusAsUser(String packageName, int status, int userId) {
16461c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        try {
16471c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio            return mPM.updateIntentVerificationStatus(packageName, status, userId);
16481c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        } catch (RemoteException e) {
1649f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16501c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        }
16511c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    }
16521c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio
16531c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    @Override
1654b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
16551c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    public List<IntentFilterVerificationInfo> getIntentFilterVerifications(String packageName) {
16561c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        try {
1657b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<IntentFilterVerificationInfo> parceledList =
1658b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getIntentFilterVerifications(packageName);
1659b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
1660b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
1661b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
1662b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
16631c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        } catch (RemoteException e) {
1664f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16651c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio        }
16661c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    }
16671c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio
16681c1b47125da018b44240739db75f8898e064a948Fabrice Di Meglio    @Override
1669b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov    @SuppressWarnings("unchecked")
16700788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio    public List<IntentFilter> getAllIntentFilters(String packageName) {
16710788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio        try {
1672b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            ParceledListSlice<IntentFilter> parceledList =
1673b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                    mPM.getAllIntentFilters(packageName);
1674b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            if (parceledList == null) {
1675b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov                return Collections.emptyList();
1676b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            }
1677b2c2e452e5bf49ee82929972631761310159016dSvetoslav Ganov            return parceledList.getList();
16780788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio        } catch (RemoteException e) {
1679f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16800788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio        }
16810788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio    }
16820788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio
16830788595e0c9bc5e8c1907c63db595010006ef5b4Fabrice Di Meglio    @Override
1684e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public String getDefaultBrowserPackageNameAsUser(int userId) {
16856227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        try {
16866227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio            return mPM.getDefaultBrowserPackageName(userId);
16876227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        } catch (RemoteException e) {
1688f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16896227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        }
16906227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio    }
16916227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio
16926227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio    @Override
1693e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
16946227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        try {
16956227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio            return mPM.setDefaultBrowserPackageName(packageName, userId);
16966227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        } catch (RemoteException e) {
1697f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
16986227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio        }
16996227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio    }
17006227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio
17016227172310663e1267b1fabd68be890a1cb7e145Fabrice Di Meglio    @Override
1702880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    public void setInstallerPackageName(String targetPackage,
1703880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn            String installerPackageName) {
1704880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        try {
1705880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn            mPM.setInstallerPackageName(targetPackage, installerPackageName);
1706880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        } catch (RemoteException e) {
1707f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1708880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        }
1709880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    }
1710880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn
1711880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    @Override
1712620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public String getInstallerPackageName(String packageName) {
1713620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        try {
1714620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return mPM.getInstallerPackageName(packageName);
1715620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        } catch (RemoteException e) {
1716f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1717620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1718620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1719620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1720620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    @Override
1721620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public int getMoveStatus(int moveId) {
1722390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1723620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return mPM.getMoveStatus(moveId);
1724390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1725f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1726b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey        }
1727b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey    }
1728b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey
1729b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey    @Override
1730620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public void registerMoveCallback(MoveCallback callback, Handler handler) {
1731620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        synchronized (mDelegates) {
1732620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            final MoveCallbackDelegate delegate = new MoveCallbackDelegate(callback,
1733620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    handler.getLooper());
1734620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            try {
1735620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                mPM.registerMoveCallback(delegate);
1736620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            } catch (RemoteException e) {
1737f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                throw e.rethrowFromSystemServer();
1738620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
1739620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            mDelegates.add(delegate);
1740620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1741620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1742620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1743620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    @Override
1744620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public void unregisterMoveCallback(MoveCallback callback) {
1745620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        synchronized (mDelegates) {
1746620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            for (Iterator<MoveCallbackDelegate> i = mDelegates.iterator(); i.hasNext();) {
1747620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                final MoveCallbackDelegate delegate = i.next();
1748620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                if (delegate.mCallback == callback) {
1749620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    try {
1750620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                        mPM.unregisterMoveCallback(delegate);
1751620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    } catch (RemoteException e) {
1752f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                        throw e.rethrowFromSystemServer();
1753620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    }
1754620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    i.remove();
1755620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                }
1756620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
1757620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1758620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1759620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1760620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    @Override
1761620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public int movePackage(String packageName, VolumeInfo vol) {
1762b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey        try {
1763620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            final String volumeUuid;
1764620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.id)) {
1765620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = StorageManager.UUID_PRIVATE_INTERNAL;
1766620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            } else if (vol.isPrimaryPhysical()) {
1767620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = StorageManager.UUID_PRIMARY_PHYSICAL;
1768620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            } else {
1769620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = Preconditions.checkNotNull(vol.fsUuid);
1770620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
1771620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1772620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return mPM.movePackage(packageName, volumeUuid);
1773b2b9ab8354da1485178cd8d8e9d89ac915b3f269Jeff Sharkey        } catch (RemoteException e) {
1774f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1775390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1776390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1777390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1778390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1779620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public @Nullable VolumeInfo getPackageCurrentVolume(ApplicationInfo app) {
1780e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        final StorageManager storage = mContext.getSystemService(StorageManager.class);
1781e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        if (app.isInternal()) {
1782620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return storage.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL);
1783e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        } else if (app.isExternalAsec()) {
1784620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return storage.getPrimaryPhysicalVolume();
1785e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        } else {
1786620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return storage.findVolumeByUuid(app.volumeUuid);
1787e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        }
1788e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey    }
1789e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1790e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey    @Override
1791620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public @NonNull List<VolumeInfo> getPackageCandidateVolumes(ApplicationInfo app) {
1792e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        final StorageManager storage = mContext.getSystemService(StorageManager.class);
1793620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final VolumeInfo currentVol = getPackageCurrentVolume(app);
1794e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        final List<VolumeInfo> vols = storage.getVolumes();
1795e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        final List<VolumeInfo> candidates = new ArrayList<>();
1796e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        for (VolumeInfo vol : vols) {
1797f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy            if (Objects.equals(vol, currentVol) || isPackageCandidateVolume(mContext, app, vol)) {
1798e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey                candidates.add(vol);
1799e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey            }
1800e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        }
1801e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        return candidates;
1802e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey    }
1803e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1804f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki    private boolean isPackageCandidateVolume(
1805f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy            ContextImpl context, ApplicationInfo app, VolumeInfo vol) {
1806f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy        final boolean forceAllowOnExternal = Settings.Global.getInt(
1807f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy                context.getContentResolver(), Settings.Global.FORCE_ALLOW_ON_EXTERNAL, 0) != 0;
1808e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        // Private internal is always an option
1809e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
1810e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey            return true;
1811e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        }
1812e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1813e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        // System apps and apps demanding internal storage can't be moved
1814e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        // anywhere else
1815f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy        if (app.isSystemApp()) {
1816f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy            return false;
1817f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy        }
1818f39ca8f5e5f43f130b4590921087a63f88bb8286Todd Kennedy        if (!forceAllowOnExternal
181930a4e6d514773b0be4235a4448a6848e26505ff3Dianne Hackborn                && (app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY
182030a4e6d514773b0be4235a4448a6848e26505ff3Dianne Hackborn                        || app.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED)) {
1821e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey            return false;
1822e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        }
1823e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1824620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        // Gotta be able to write there
1825620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        if (!vol.isMountedWritable()) {
1826620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return false;
1827620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1828620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1829620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        // Moving into an ASEC on public primary is only option internal
1830620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        if (vol.isPrimaryPhysical()) {
1831620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return app.isInternal();
1832e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        }
1833e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1834f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki        // Some apps can't be moved. (e.g. device admins)
1835f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki        try {
1836f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki            if (mPM.isPackageDeviceAdminOnAnyUser(app.packageName)) {
1837f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki                return false;
1838f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki            }
1839f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki        } catch (RemoteException e) {
1840f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1841f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki        }
1842f34db0a17ee035c165a4e81e9192f73d2455bd1cMakoto Onuki
1843e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        // Otherwise we can move to any private volume
1844e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey        return (vol.getType() == VolumeInfo.TYPE_PRIVATE);
1845e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey    }
1846e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey
1847e2d45be4dae116307f8edd85eaa61134221cb8f9Jeff Sharkey    @Override
1848620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public int movePrimaryStorage(VolumeInfo vol) {
1849390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1850620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            final String volumeUuid;
1851620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.id)) {
1852620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = StorageManager.UUID_PRIVATE_INTERNAL;
1853620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            } else if (vol.isPrimaryPhysical()) {
1854620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = StorageManager.UUID_PRIMARY_PHYSICAL;
1855620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            } else {
1856620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                volumeUuid = Preconditions.checkNotNull(vol.fsUuid);
1857620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
1858620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1859620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return mPM.movePrimaryStorage(volumeUuid);
1860390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1861f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1862390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1863620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1864620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1865275e3e43f2fba72fa99001cafa2a70e5478fc545Jeff Sharkey    @Override
1866620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public @Nullable VolumeInfo getPrimaryStorageCurrentVolume() {
1867620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final StorageManager storage = mContext.getSystemService(StorageManager.class);
1868620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final String volumeUuid = storage.getPrimaryStorageUuid();
186950a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        return storage.findVolumeByQualifiedUuid(volumeUuid);
1870620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1871620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1872275e3e43f2fba72fa99001cafa2a70e5478fc545Jeff Sharkey    @Override
1873620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public @NonNull List<VolumeInfo> getPrimaryStorageCandidateVolumes() {
1874620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final StorageManager storage = mContext.getSystemService(StorageManager.class);
1875620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final VolumeInfo currentVol = getPrimaryStorageCurrentVolume();
1876620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final List<VolumeInfo> vols = storage.getVolumes();
1877620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final List<VolumeInfo> candidates = new ArrayList<>();
1878fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey        if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL,
1879fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey                storage.getPrimaryStorageUuid()) && currentVol != null) {
1880fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey            // TODO: support moving primary physical to emulated volume
1881fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey            candidates.add(currentVol);
1882fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey        } else {
1883fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey            for (VolumeInfo vol : vols) {
1884fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey                if (Objects.equals(vol, currentVol) || isPrimaryStorageCandidateVolume(vol)) {
1885fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey                    candidates.add(vol);
1886fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey                }
1887620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
1888620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1889620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        return candidates;
1890620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
1891620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1892620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    private static boolean isPrimaryStorageCandidateVolume(VolumeInfo vol) {
1893620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        // Private internal is always an option
1894620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
1895620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return true;
1896620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1897620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1898620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        // Gotta be able to write there
1899620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        if (!vol.isMountedWritable()) {
1900620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return false;
1901620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
1902620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
1903fced534dec1088bdd7da1495d76b73996dc8a1a1Jeff Sharkey        // We can move to any private volume
1904620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        return (vol.getType() == VolumeInfo.TYPE_PRIVATE);
1905390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1906390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1907390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1908390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
19090e27c87af691bc53d320496bbffa58752608608dRobin Lee        deletePackageAsUser(packageName, observer, flags, mContext.getUserId());
19109a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    }
19119a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot
19129a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    @Override
19139a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot    public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
19149a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            int userId) {
1915390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
19169a80e53b27cd1ca00364a30a0ad153c83000b9d2Nicolas Prevot            mPM.deletePackageAsUser(packageName, observer, userId, flags);
1917390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1918f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1919390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1920390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1921fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4cJeff Sharkey
1922390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1923390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void clearApplicationUserData(String packageName,
1924390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                         IPackageDataObserver observer) {
1925390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1926ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            mPM.clearApplicationUserData(packageName, observer, mContext.getUserId());
1927390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1928f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1929390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1930390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1931390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1932390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void deleteApplicationCacheFiles(String packageName,
1933390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                            IPackageDataObserver observer) {
1934390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1935390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.deleteApplicationCacheFiles(packageName, observer);
1936390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1937f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1938390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1939390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1940529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey
1941390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
194278c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla    public void deleteApplicationCacheFilesAsUser(String packageName, int userId,
194378c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla            IPackageDataObserver observer) {
194478c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla        try {
194578c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla            mPM.deleteApplicationCacheFilesAsUser(packageName, userId, observer);
194678c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla        } catch (RemoteException e) {
194778c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla            throw e.rethrowFromSystemServer();
194878c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla        }
194978c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla    }
195078c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla
195178c9eb8947538f63d2e06684663d400991dfff8fSuprabh Shukla    @Override
1952529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey    public void freeStorageAndNotify(String volumeUuid, long idealStorageSize,
1953529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey            IPackageDataObserver observer) {
1954390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1955529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey            mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, observer);
1956390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1957f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1958390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1959390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1960390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1961390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1962529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey    public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) {
1963390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1964529f91fc8e7e884ef19bef8eb3e4e3a1d69336f4Jeff Sharkey            mPM.freeStorage(volumeUuid, freeStorageSize, pi);
1965390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1966f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1967390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1968390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1969390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1970390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1971eb84b1843a3f6805c6109c1d9d023550229a3fc5Andrei Stingaceanu    public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
1972eb84b1843a3f6805c6109c1d9d023550229a3fc5Andrei Stingaceanu            int userId) {
19731e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu        try {
1974eb84b1843a3f6805c6109c1d9d023550229a3fc5Andrei Stingaceanu            return mPM.setPackagesSuspendedAsUser(packageNames, suspended, userId);
19751e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu        } catch (RemoteException e) {
1976f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
19771e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu        }
1978355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu    }
1979355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu
1980355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu    @Override
1981355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu    public boolean isPackageSuspendedForUser(String packageName, int userId) {
1982355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu        try {
1983355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu            return mPM.isPackageSuspendedForUser(packageName, userId);
1984355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu        } catch (RemoteException e) {
1985f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1986355b232d7998cfc9b29d42a0356390e25191bcbdAndrei Stingaceanu        }
19871e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu    }
19881e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu
19891e2839188fb49575b86646d3aadb355c81ef9cc5Andrei Stingaceanu    @Override
1990e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public void getPackageSizeInfoAsUser(String packageName, int userHandle,
19910c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn            IPackageStatsObserver observer) {
1992390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
19930c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn            mPM.getPackageSizeInfo(packageName, userHandle, observer);
1994390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1995f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
1996390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1997390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1998d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey
1999390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2000390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void addPackageToPreferred(String packageName) {
2001d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey        Log.w(TAG, "addPackageToPreferred() is a no-op");
2002390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2003390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2004390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2005390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void removePackageFromPreferred(String packageName) {
2006d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey        Log.w(TAG, "removePackageFromPreferred() is a no-op");
2007390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2008390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2009390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2010390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PackageInfo> getPreferredPackages(int flags) {
2011d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey        Log.w(TAG, "getPreferredPackages() is a no-op");
2012d5896630f6a2f21da107031cab216dc93bdcd851Jeff Sharkey        return Collections.emptyList();
2013390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2014390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2015390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2016390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void addPreferredActivity(IntentFilter filter,
2017390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                     int match, ComponentName[] set, ComponentName activity) {
2018390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2019ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            mPM.addPreferredActivity(filter, match, set, activity, mContext.getUserId());
2020a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani        } catch (RemoteException e) {
2021f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2022a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani        }
2023a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani    }
2024a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani
2025a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani    @Override
2026e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey    public void addPreferredActivityAsUser(IntentFilter filter, int match,
2027a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani            ComponentName[] set, ComponentName activity, int userId) {
2028a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani        try {
2029a3f133afe885f9e005dfc0584cb7b3b90f75f665Amith Yamasani            mPM.addPreferredActivity(filter, match, set, activity, userId);
2030390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2031f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2032390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2033390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2034390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2035390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2036390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void replacePreferredActivity(IntentFilter filter,
2037390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                         int match, ComponentName[] set, ComponentName activity) {
2038390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
20390e27c87af691bc53d320496bbffa58752608608dRobin Lee            mPM.replacePreferredActivity(filter, match, set, activity, mContext.getUserId());
204041c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani        } catch (RemoteException e) {
2041f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
204241c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani        }
204341c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani    }
204441c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani
204541c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani    @Override
204641c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani    public void replacePreferredActivityAsUser(IntentFilter filter,
204741c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani                                         int match, ComponentName[] set, ComponentName activity,
204841c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani                                         int userId) {
204941c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani        try {
205041c1ded7f042a4cf303479550b38fa66d7a18906Amith Yamasani            mPM.replacePreferredActivity(filter, match, set, activity, userId);
2051390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2052f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2053390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2054390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2055390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2056390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2057390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void clearPackagePreferredActivities(String packageName) {
2058390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2059390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.clearPackagePreferredActivities(packageName);
2060390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2061f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2062390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2063390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2064390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2065390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2066390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getPreferredActivities(List<IntentFilter> outFilters,
2067390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                      List<ComponentName> outActivities, String packageName) {
2068390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2069390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getPreferredActivities(outFilters, outActivities, packageName);
2070390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2071f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2072390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2073390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2074390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2075390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2076a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate    public ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
2077a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate        try {
2078a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate            return mPM.getHomeActivities(outActivities);
2079a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate        } catch (RemoteException e) {
2080f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2081a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate        }
2082a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate    }
2083a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate
2084a2a0850de8e7324db37e0595d5374bb9c9903461Christopher Tate    @Override
2085390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void setComponentEnabledSetting(ComponentName componentName,
2086390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                           int newState, int flags) {
2087390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2088ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId());
2089390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2090f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2091390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2092390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2093390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2094390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2095390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getComponentEnabledSetting(ComponentName componentName) {
2096390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2097ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            return mPM.getComponentEnabledSetting(componentName, mContext.getUserId());
2098390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2099f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2100390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2101390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2102390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2103390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2104390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void setApplicationEnabledSetting(String packageName,
2105390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                             int newState, int flags) {
2106390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
21073fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn            mPM.setApplicationEnabledSetting(packageName, newState, flags,
210895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                    mContext.getUserId(), mContext.getOpPackageName());
2109390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2110f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2111390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2112390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2113390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2114390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
2115390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getApplicationEnabledSetting(String packageName) {
2116390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
2117ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey            return mPM.getApplicationEnabledSetting(packageName, mContext.getUserId());
2118390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
2119f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2120390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
2121390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
2122390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2123655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    @Override
2124bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka    public void flushPackageRestrictionsAsUser(int userId) {
2125bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka        try {
2126bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka            mPM.flushPackageRestrictionsAsUser(userId);
2127bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka        } catch (RemoteException e) {
2128bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka            throw e.rethrowFromSystemServer();
2129bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka        }
2130bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka    }
2131bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka
2132bbb3ff2b2a29d42771a9ce2fe2d6f576cff62617Sudheer Shanka    @Override
2133e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani    public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden,
2134655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            UserHandle user) {
2135655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        try {
2136e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            return mPM.setApplicationHiddenSettingAsUser(packageName, hidden,
2137655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani                    user.getIdentifier());
213827b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey        } catch (RemoteException e) {
2139f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2140655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
2141655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    }
2142655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
2143655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    @Override
2144e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani    public boolean getApplicationHiddenSettingAsUser(String packageName, UserHandle user) {
2145655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        try {
2146e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            return mPM.getApplicationHiddenSettingAsUser(packageName, user.getIdentifier());
214727b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey        } catch (RemoteException e) {
2148f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2149655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
2150655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    }
2151655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
2152c6f22499f3046684d7175e10ca42cce1492cd36fdcashman    /** @hide */
21539d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    @Override
21549d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    public KeySet getKeySetByAlias(String packageName, String alias) {
21559d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(packageName);
21569d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(alias);
21579d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        try {
215827b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey            return mPM.getKeySetByAlias(packageName, alias);
21599d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        } catch (RemoteException e) {
2160f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
21619d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        }
21629d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    }
21639d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman
2164c6f22499f3046684d7175e10ca42cce1492cd36fdcashman    /** @hide */
21659d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    @Override
21669d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    public KeySet getSigningKeySet(String packageName) {
21679d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(packageName);
21689d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        try {
216927b2e6978716f9886db40f4fcf2e060b50637ac5Jeff Sharkey            return mPM.getSigningKeySet(packageName);
21709d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        } catch (RemoteException e) {
2171f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
21729d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        }
21739d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    }
21749d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman
2175c6f22499f3046684d7175e10ca42cce1492cd36fdcashman    /** @hide */
21769d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    @Override
21779d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    public boolean isSignedBy(String packageName, KeySet ks) {
21789d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(packageName);
21799d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(ks);
21809d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        try {
2181c6f22499f3046684d7175e10ca42cce1492cd36fdcashman            return mPM.isPackageSignedByKeySet(packageName, ks);
21829d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        } catch (RemoteException e) {
2183f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
21849d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        }
21859d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    }
21869d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman
2187c6f22499f3046684d7175e10ca42cce1492cd36fdcashman    /** @hide */
21889d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    @Override
21899d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    public boolean isSignedByExactly(String packageName, KeySet ks) {
21909d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(packageName);
21919d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        Preconditions.checkNotNull(ks);
21929d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        try {
2193c6f22499f3046684d7175e10ca42cce1492cd36fdcashman            return mPM.isPackageSignedByKeySetExactly(packageName, ks);
21949d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        } catch (RemoteException e) {
2195f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
21969d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman        }
21979d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman    }
21989d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman
21990aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    /**
22000aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root     * @hide
22010aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root     */
22020aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    @Override
22030aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    public VerifierDeviceIdentity getVerifierDeviceIdentity() {
22040aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        try {
22050aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            return mPM.getVerifierDeviceIdentity();
22060aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        } catch (RemoteException e) {
2207f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
22080aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        }
22090aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    }
22100aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
22119f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao    /**
22129f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao     * @hide
22139f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao     */
22149f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao    @Override
22159f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao    public boolean isUpgrade() {
22169f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao        try {
22179f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao            return mPM.isUpgrade();
22189f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao        } catch (RemoteException e) {
2219f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
22209f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao        }
22219f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao    }
22229f60c08a446e38f9e2d5271546ef69ca5941eba9Jeff Hao
22233a44f3f1b446315ef894e01d2ab9b5388c2bd8c4Jeff Sharkey    @Override
222416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    public PackageInstaller getPackageInstaller() {
222516c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey        synchronized (mLock) {
222616c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            if (mInstaller == null) {
222716c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                try {
2228a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    mInstaller = new PackageInstaller(mContext, this, mPM.getPackageInstaller(),
222916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                            mContext.getPackageName(), mContext.getUserId());
223016c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                } catch (RemoteException e) {
2231f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                    throw e.rethrowFromSystemServer();
223216c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                }
223316c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            }
223416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            return mInstaller;
22353a44f3f1b446315ef894e01d2ab9b5388c2bd8c4Jeff Sharkey        }
22363a44f3f1b446315ef894e01d2ab9b5388c2bd8c4Jeff Sharkey    }
22373a44f3f1b446315ef894e01d2ab9b5388c2bd8c4Jeff Sharkey
22386c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey    @Override
22396c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey    public boolean isPackageAvailable(String packageName) {
22406c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey        try {
22416c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey            return mPM.isPackageAvailable(packageName, mContext.getUserId());
22426c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey        } catch (RemoteException e) {
2243f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
22446c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey        }
22456c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey    }
22466c833e07a05c48ca60ee4d72421bf8b1e78dc710Jeff Sharkey
2247c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    /**
2248c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot     * @hide
2249c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot     */
2250c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    @Override
225163798c596dc757135950313eb4bb44ca58696c68Nicolas Prevot    public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, int targetUserId,
225263798c596dc757135950313eb4bb44ca58696c68Nicolas Prevot            int flags) {
2253c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        try {
22543f7777fa4f1d392e18bad39edcd4539880c52ff9Nicolas Prevot            mPM.addCrossProfileIntentFilter(filter, mContext.getOpPackageName(),
22554b8d5821512c6a4fdaf442f6d48e1dc412539136Nicolas Prevot                    sourceUserId, targetUserId, flags);
2256c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        } catch (RemoteException e) {
2257f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2258c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        }
2259c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    }
2260c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot
2261c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    /**
2262c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot     * @hide
2263c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot     */
2264c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    @Override
22658194899071e0a84c95ef10614bd1b9485b48f589Nicolas Prevot    public void clearCrossProfileIntentFilters(int sourceUserId) {
2266c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        try {
22674b8d5821512c6a4fdaf442f6d48e1dc412539136Nicolas Prevot            mPM.clearCrossProfileIntentFilters(sourceUserId, mContext.getOpPackageName());
2268c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        } catch (RemoteException e) {
2269f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw e.rethrowFromSystemServer();
2270c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot        }
2271c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot    }
2272c79586ede6dcd6a167bc8360f058cb5cc655b33dNicolas Prevot
227388cc346d0602e0b173b5076cd0051120682da601Nicolas Prevot    /**
227488cc346d0602e0b173b5076cd0051120682da601Nicolas Prevot     * @hide
227588cc346d0602e0b173b5076cd0051120682da601Nicolas Prevot     */
22767f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot    public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
2277ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        Drawable dr = loadUnbadgedItemIcon(itemInfo, appInfo);
2278ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        if (itemInfo.showUserIcon != UserHandle.USER_NULL) {
2279ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz            return dr;
2280ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        }
2281ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        return getUserBadgedIcon(dr, new UserHandle(mContext.getUserId()));
2282ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    }
2283ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz
2284ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    /**
2285ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * @hide
2286ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     */
2287ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    public Drawable loadUnbadgedItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
22887f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        if (itemInfo.showUserIcon != UserHandle.USER_NULL) {
228964d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghina            Bitmap bitmap = getUserManager().getUserIcon(itemInfo.showUserIcon);
229064d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghina            if (bitmap == null) {
229164d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghina                return UserIcons.getDefaultUserIcon(itemInfo.showUserIcon, /* light= */ false);
229264d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghina            }
229364d4dca63f65e4c7d4a829c85ff6670bdd34e2ebAlexandra Gherghina            return new BitmapDrawable(bitmap);
22947f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        }
2295db811dbc704fd8170e66951e992e83098aecf158Alexandra Gherghina        Drawable dr = null;
2296db811dbc704fd8170e66951e992e83098aecf158Alexandra Gherghina        if (itemInfo.packageName != null) {
2297db811dbc704fd8170e66951e992e83098aecf158Alexandra Gherghina            dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo);
2298db811dbc704fd8170e66951e992e83098aecf158Alexandra Gherghina        }
2299a71e3903e5d3f38795c443c052125faede9d9ec7Alexandra Gherghina        if (dr == null) {
2300a709314537164d959a18ee78768c69c4a9cb33c7Alexandra Gherghina            dr = itemInfo.loadDefaultIcon(this);
23017f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        }
2302ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        return dr;
2303c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
2304c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2305c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    private Drawable getBadgedDrawable(Drawable drawable, Drawable badgeDrawable,
2306c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            Rect badgeLocation, boolean tryBadgeInPlace) {
2307c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        final int badgedWidth = drawable.getIntrinsicWidth();
2308c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        final int badgedHeight = drawable.getIntrinsicHeight();
2309c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        final boolean canBadgeInPlace = tryBadgeInPlace
2310c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                && (drawable instanceof BitmapDrawable)
2311c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                && ((BitmapDrawable) drawable).getBitmap().isMutable();
2312c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2313c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        final Bitmap bitmap;
2314c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (canBadgeInPlace) {
2315c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            bitmap = ((BitmapDrawable) drawable).getBitmap();
2316c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        } else {
2317c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            bitmap = Bitmap.createBitmap(badgedWidth, badgedHeight, Bitmap.Config.ARGB_8888);
2318c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
2319c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        Canvas canvas = new Canvas(bitmap);
2320c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2321c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (!canBadgeInPlace) {
2322c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            drawable.setBounds(0, 0, badgedWidth, badgedHeight);
2323c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            drawable.draw(canvas);
2324c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
2325c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2326c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (badgeLocation != null) {
2327c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            if (badgeLocation.left < 0 || badgeLocation.top < 0
2328c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                    || badgeLocation.width() > badgedWidth || badgeLocation.height() > badgedHeight) {
2329c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                throw new IllegalArgumentException("Badge location " + badgeLocation
2330c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                        + " not in badged drawable bounds "
2331c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                        + new Rect(0, 0, badgedWidth, badgedHeight));
2332c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            }
2333c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            badgeDrawable.setBounds(0, 0, badgeLocation.width(), badgeLocation.height());
2334c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2335c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            canvas.save();
2336c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            canvas.translate(badgeLocation.left, badgeLocation.top);
2337c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            badgeDrawable.draw(canvas);
2338c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            canvas.restore();
2339c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        } else {
2340c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            badgeDrawable.setBounds(0, 0, badgedWidth, badgedHeight);
2341c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            badgeDrawable.draw(canvas);
2342c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
2343c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2344c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        if (!canBadgeInPlace) {
2345c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            BitmapDrawable mergedDrawable = new BitmapDrawable(mContext.getResources(), bitmap);
2346c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2347c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            if (drawable instanceof BitmapDrawable) {
2348c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
2349c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav                mergedDrawable.setTargetDensity(bitmapDrawable.getBitmap().getDensity());
2350c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            }
2351c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2352c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            return mergedDrawable;
2353c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
2354c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
2355c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return drawable;
2356c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
2357c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
23588673b2899e775014336efff44ea88dcac2b25bddTony Mak    private int getBadgeResIdForUser(int userId) {
2359c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        // Return the framework-provided badge.
23608673b2899e775014336efff44ea88dcac2b25bddTony Mak        if (isManagedProfile(userId)) {
2361c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav            return com.android.internal.R.drawable.ic_corp_icon_badge;
2362c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        }
2363c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav        return 0;
2364c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav    }
2365c7d62f02b8acfd0a6b31f8544ec2c07e780fe4bbSvetoslav
23668673b2899e775014336efff44ea88dcac2b25bddTony Mak    private boolean isManagedProfile(int userId) {
23678673b2899e775014336efff44ea88dcac2b25bddTony Mak        return getUserManager().isManagedProfile(userId);
236888cc346d0602e0b173b5076cd0051120682da601Nicolas Prevot    }
236988cc346d0602e0b173b5076cd0051120682da601Nicolas Prevot
2370620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    /** {@hide} */
2371620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    private static class MoveCallbackDelegate extends IPackageMoveObserver.Stub implements
2372620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            Handler.Callback {
237350a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        private static final int MSG_CREATED = 1;
237450a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        private static final int MSG_STATUS_CHANGED = 2;
2375620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
2376620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final MoveCallback mCallback;
2377620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        final Handler mHandler;
2378620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
2379620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        public MoveCallbackDelegate(MoveCallback callback, Looper looper) {
2380620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            mCallback = callback;
2381620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            mHandler = new Handler(looper, this);
2382620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
2383620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
2384620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        @Override
2385620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        public boolean handleMessage(Message msg) {
2386620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            switch (msg.what) {
238750a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                case MSG_CREATED: {
238850a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                    final SomeArgs args = (SomeArgs) msg.obj;
238950a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                    mCallback.onCreated(args.argi1, (Bundle) args.arg2);
239050a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                    args.recycle();
239150a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                    return true;
239250a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                }
239350a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                case MSG_STATUS_CHANGED: {
2394b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkey                    final SomeArgs args = (SomeArgs) msg.obj;
239550a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                    mCallback.onStatusChanged(args.argi1, args.argi2, (long) args.arg3);
2396b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkey                    args.recycle();
2397620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey                    return true;
239850a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey                }
2399620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            }
2400620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            return false;
2401620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
2402620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
2403620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        @Override
240450a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        public void onCreated(int moveId, Bundle extras) {
240550a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            final SomeArgs args = SomeArgs.obtain();
240650a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            args.argi1 = moveId;
240750a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            args.arg2 = extras;
240850a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            mHandler.obtainMessage(MSG_CREATED, args).sendToTarget();
240950a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        }
241050a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey
241150a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        @Override
241250a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey        public void onStatusChanged(int moveId, int status, long estMillis) {
2413b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkey            final SomeArgs args = SomeArgs.obtain();
2414b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkey            args.argi1 = moveId;
241550a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            args.argi2 = status;
241650a05454795c93ac483f5cb6819e74cb17be1b5bJeff Sharkey            args.arg3 = estMillis;
2417b36586a7c9b7718f33961406537e27bbd9b16211Jeff Sharkey            mHandler.obtainMessage(MSG_STATUS_CHANGED, args).sendToTarget();
2418620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
2419620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
2420620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
2421390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final ContextImpl mContext;
2422390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final IPackageManager mPM;
2423390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
2424390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final Object sSync = new Object();
2425add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn    private static ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>> sIconCache
2426add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn            = new ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>>();
2427add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn    private static ArrayMap<ResourceName, WeakReference<CharSequence>> sStringCache
2428add005cf94dcc815d29b54588c76fd87929075b3Dianne Hackborn            = new ArrayMap<ResourceName, WeakReference<CharSequence>>();
2429f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2430f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    private final Map<OnPermissionsChangedListener, IOnPermissionsChangeListener>
2431f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            mPermissionListeners = new ArrayMap<>();
2432f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2433f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    public class OnPermissionsChangeListenerDelegate extends IOnPermissionsChangeListener.Stub
2434f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            implements Handler.Callback{
2435f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        private static final int MSG_PERMISSIONS_CHANGED = 1;
2436f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2437f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        private final OnPermissionsChangedListener mListener;
2438f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        private final Handler mHandler;
2439f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2440f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2441f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        public OnPermissionsChangeListenerDelegate(OnPermissionsChangedListener listener,
2442f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                Looper looper) {
2443f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            mListener = listener;
2444f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            mHandler = new Handler(looper, this);
2445f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        }
2446f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2447f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        @Override
2448f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        public void onPermissionsChanged(int uid) {
2449f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget();
2450f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        }
2451f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav
2452f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        @Override
2453f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        public boolean handleMessage(Message msg) {
2454f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            switch (msg.what) {
2455f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                case MSG_PERMISSIONS_CHANGED: {
2456f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    final int uid = msg.arg1;
2457f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    mListener.onPermissionsChanged(uid);
2458f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                    return true;
2459f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav                }
2460f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            }
2461f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav            return false;
2462f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav        }
2463f7c06eb03ab4479b9d0656a23a4733d17e995183Svetoslav    }
2464390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick}
2465