blob: 9ddfd881310fc50ddb853159439e587905255f85 [file] [log] [blame]
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app;
18
Tor Norbye7b9c9122013-05-30 16:48:33 -070019import android.annotation.DrawableRes;
20import android.annotation.StringRes;
21import android.annotation.XmlRes;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080022import android.content.ComponentName;
23import android.content.ContentResolver;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.content.IntentSender;
27import android.content.pm.ActivityInfo;
28import android.content.pm.ApplicationInfo;
29import android.content.pm.ComponentInfo;
Anonymous Cowardceb1b0b2012-04-24 10:35:16 -070030import android.content.pm.ContainerEncryptionParams;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080031import android.content.pm.FeatureInfo;
32import android.content.pm.IPackageDataObserver;
33import android.content.pm.IPackageDeleteObserver;
34import android.content.pm.IPackageInstallObserver;
35import android.content.pm.IPackageManager;
36import android.content.pm.IPackageMoveObserver;
37import android.content.pm.IPackageStatsObserver;
38import android.content.pm.InstrumentationInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080039import android.content.pm.IntentFilterVerificationInfo;
dcashman9d2f4412014-06-09 09:27:54 -070040import android.content.pm.KeySet;
Jeff Sharkey513a0742014-07-08 17:10:32 -070041import android.content.pm.ManifestDigest;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080042import android.content.pm.PackageInfo;
Jeff Sharkey3a44f3f2014-04-28 17:36:31 -070043import android.content.pm.PackageInstaller;
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +010044import android.content.pm.PackageItemInfo;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080045import android.content.pm.PackageManager;
Kenny Roote6cd0c72011-05-19 12:48:14 -070046import android.content.pm.ParceledListSlice;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080047import android.content.pm.PermissionGroupInfo;
48import android.content.pm.PermissionInfo;
49import android.content.pm.ProviderInfo;
50import android.content.pm.ResolveInfo;
51import android.content.pm.ServiceInfo;
Svetoslavc7d62f02014-09-04 15:39:54 -070052import android.content.pm.UserInfo;
rich cannings706e8ba2012-08-20 13:20:14 -070053import android.content.pm.VerificationParams;
Kenny Root0aaa0d92011-09-12 16:42:55 -070054import android.content.pm.VerifierDeviceIdentity;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080055import android.content.res.Resources;
56import android.content.res.XmlResourceParser;
Svetoslavc7d62f02014-09-04 15:39:54 -070057import android.graphics.Bitmap;
58import android.graphics.Canvas;
59import android.graphics.Rect;
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +010060import android.graphics.drawable.BitmapDrawable;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080061import android.graphics.drawable.Drawable;
62import android.net.Uri;
63import android.os.Process;
64import android.os.RemoteException;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -070065import android.os.SystemProperties;
Amith Yamasani67df64b2012-12-14 12:09:36 -080066import android.os.UserHandle;
Nicolas Prevot88cc3462014-05-14 14:51:48 +010067import android.os.UserManager;
Dianne Hackbornadd005c2013-07-17 18:43:12 -070068import android.util.ArrayMap;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080069import android.util.Log;
Jeff Browna492c3a2012-08-23 19:48:44 -070070import android.view.Display;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -070071
72import dalvik.system.VMRuntime;
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -070073
74import com.android.internal.annotations.GuardedBy;
dcashman9d2f4412014-06-09 09:27:54 -070075import com.android.internal.util.Preconditions;
Alexandra Gherghina64d4dca2014-08-28 18:26:56 +010076import com.android.internal.util.UserIcons;
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -070077
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080078import java.lang.ref.WeakReference;
79import java.util.ArrayList;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080080import java.util.List;
81
82/*package*/
83final class ApplicationPackageManager extends PackageManager {
84 private static final String TAG = "ApplicationPackageManager";
Brad Fitzpatrick390dae12010-11-10 08:27:28 -080085 private final static boolean DEBUG_ICONS = false;
86
Adam Lesinskid00bb5e2014-10-07 12:14:45 -070087 // Default flags to use with PackageManager when no flags are given.
88 private final static int sDefaultFlags = PackageManager.GET_SHARED_LIBRARY_FILES;
89
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -070090 private final Object mLock = new Object();
91
92 @GuardedBy("mLock")
93 private UserManager mUserManager;
94 @GuardedBy("mLock")
95 private PackageInstaller mInstaller;
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +010096
97 UserManager getUserManager() {
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -070098 synchronized (mLock) {
99 if (mUserManager == null) {
100 mUserManager = UserManager.get(mContext);
101 }
102 return mUserManager;
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +0100103 }
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +0100104 }
105
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800106 @Override
107 public PackageInfo getPackageInfo(String packageName, int flags)
108 throws NameNotFoundException {
109 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700110 PackageInfo pi = mPM.getPackageInfo(packageName, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800111 if (pi != null) {
112 return pi;
113 }
114 } catch (RemoteException e) {
115 throw new RuntimeException("Package manager has died", e);
116 }
117
118 throw new NameNotFoundException(packageName);
119 }
120
121 @Override
122 public String[] currentToCanonicalPackageNames(String[] names) {
123 try {
124 return mPM.currentToCanonicalPackageNames(names);
125 } catch (RemoteException e) {
126 throw new RuntimeException("Package manager has died", e);
127 }
128 }
129
130 @Override
131 public String[] canonicalToCurrentPackageNames(String[] names) {
132 try {
133 return mPM.canonicalToCurrentPackageNames(names);
134 } catch (RemoteException e) {
135 throw new RuntimeException("Package manager has died", e);
136 }
137 }
138
139 @Override
140 public Intent getLaunchIntentForPackage(String packageName) {
141 // First see if the package has an INFO activity; the existence of
142 // such an activity is implied to be the desired front-door for the
143 // overall package (such as if it has multiple launcher entries).
144 Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
145 intentToResolve.addCategory(Intent.CATEGORY_INFO);
146 intentToResolve.setPackage(packageName);
Dianne Hackborn19415762010-12-15 00:20:27 -0800147 List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800148
149 // Otherwise, try to find a main launcher activity.
Dianne Hackborn19415762010-12-15 00:20:27 -0800150 if (ris == null || ris.size() <= 0) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800151 // reuse the intent instance
152 intentToResolve.removeCategory(Intent.CATEGORY_INFO);
153 intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
154 intentToResolve.setPackage(packageName);
Dianne Hackborn19415762010-12-15 00:20:27 -0800155 ris = queryIntentActivities(intentToResolve, 0);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800156 }
Dianne Hackborn19415762010-12-15 00:20:27 -0800157 if (ris == null || ris.size() <= 0) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800158 return null;
159 }
160 Intent intent = new Intent(intentToResolve);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800161 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Dianne Hackborn19415762010-12-15 00:20:27 -0800162 intent.setClassName(ris.get(0).activityInfo.packageName,
163 ris.get(0).activityInfo.name);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800164 return intent;
165 }
166
167 @Override
Jose Lima970417c2014-04-10 10:42:19 -0700168 public Intent getLeanbackLaunchIntentForPackage(String packageName) {
169 // Try to find a main leanback_launcher activity.
170 Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
171 intentToResolve.addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER);
172 intentToResolve.setPackage(packageName);
173 List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
174
175 if (ris == null || ris.size() <= 0) {
176 return null;
177 }
178 Intent intent = new Intent(intentToResolve);
179 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
180 intent.setClassName(ris.get(0).activityInfo.packageName,
181 ris.get(0).activityInfo.name);
182 return intent;
183 }
184
185 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800186 public int[] getPackageGids(String packageName)
187 throws NameNotFoundException {
188 try {
Svetoslavc6d1c342015-02-26 14:44:43 -0800189 int[] gids = mPM.getPackageGids(packageName, mContext.getUserId());
190 if (gids != null) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800191 return gids;
192 }
193 } catch (RemoteException e) {
194 throw new RuntimeException("Package manager has died", e);
195 }
196
197 throw new NameNotFoundException(packageName);
198 }
199
200 @Override
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800201 public int getPackageUid(String packageName, int userHandle)
202 throws NameNotFoundException {
203 try {
204 int uid = mPM.getPackageUid(packageName, userHandle);
205 if (uid >= 0) {
206 return uid;
207 }
208 } catch (RemoteException e) {
209 throw new RuntimeException("Package manager has died", e);
210 }
211
212 throw new NameNotFoundException(packageName);
213 }
214
215 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800216 public PermissionInfo getPermissionInfo(String name, int flags)
217 throws NameNotFoundException {
218 try {
219 PermissionInfo pi = mPM.getPermissionInfo(name, flags);
220 if (pi != null) {
221 return pi;
222 }
223 } catch (RemoteException e) {
224 throw new RuntimeException("Package manager has died", e);
225 }
226
227 throw new NameNotFoundException(name);
228 }
229
230 @Override
231 public List<PermissionInfo> queryPermissionsByGroup(String group, int flags)
232 throws NameNotFoundException {
233 try {
234 List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags);
235 if (pi != null) {
236 return pi;
237 }
238 } catch (RemoteException e) {
239 throw new RuntimeException("Package manager has died", e);
240 }
241
242 throw new NameNotFoundException(group);
243 }
244
245 @Override
246 public PermissionGroupInfo getPermissionGroupInfo(String name,
247 int flags) throws NameNotFoundException {
248 try {
249 PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags);
250 if (pgi != null) {
251 return pgi;
252 }
253 } catch (RemoteException e) {
254 throw new RuntimeException("Package manager has died", e);
255 }
256
257 throw new NameNotFoundException(name);
258 }
259
260 @Override
261 public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
262 try {
263 return mPM.getAllPermissionGroups(flags);
264 } catch (RemoteException e) {
265 throw new RuntimeException("Package manager has died", e);
266 }
267 }
268
269 @Override
270 public ApplicationInfo getApplicationInfo(String packageName, int flags)
271 throws NameNotFoundException {
272 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700273 ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800274 if (ai != null) {
Narayan Kamathcaa71192014-07-16 11:06:43 +0100275 // This is a temporary hack. Callers must use
276 // createPackageContext(packageName).getApplicationInfo() to
277 // get the right paths.
278 maybeAdjustApplicationInfo(ai);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800279 return ai;
280 }
281 } catch (RemoteException e) {
282 throw new RuntimeException("Package manager has died", e);
283 }
284
285 throw new NameNotFoundException(packageName);
286 }
287
Narayan Kamathcaa71192014-07-16 11:06:43 +0100288 private static void maybeAdjustApplicationInfo(ApplicationInfo info) {
289 // If we're dealing with a multi-arch application that has both
290 // 32 and 64 bit shared libraries, we might need to choose the secondary
291 // depending on what the current runtime's instruction set is.
292 if (info.primaryCpuAbi != null && info.secondaryCpuAbi != null) {
293 final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet();
jgu214741cd92014-12-17 17:23:29 -0500294
295 // Get the instruction set that the libraries of secondary Abi is supported.
296 // In presence of a native bridge this might be different than the one secondary Abi used.
297 String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi);
298 final String secondaryDexCodeIsa = SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa);
299 secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;
Narayan Kamathcaa71192014-07-16 11:06:43 +0100300
301 // If the runtimeIsa is the same as the primary isa, then we do nothing.
302 // Everything will be set up correctly because info.nativeLibraryDir will
303 // correspond to the right ISA.
304 if (runtimeIsa.equals(secondaryIsa)) {
305 info.nativeLibraryDir = info.secondaryNativeLibraryDir;
306 }
307 }
308 }
309
310
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800311 @Override
312 public ActivityInfo getActivityInfo(ComponentName className, int flags)
313 throws NameNotFoundException {
314 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700315 ActivityInfo ai = mPM.getActivityInfo(className, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800316 if (ai != null) {
317 return ai;
318 }
319 } catch (RemoteException e) {
320 throw new RuntimeException("Package manager has died", e);
321 }
322
323 throw new NameNotFoundException(className.toString());
324 }
325
326 @Override
327 public ActivityInfo getReceiverInfo(ComponentName className, int flags)
328 throws NameNotFoundException {
329 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700330 ActivityInfo ai = mPM.getReceiverInfo(className, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800331 if (ai != null) {
332 return ai;
333 }
334 } catch (RemoteException e) {
335 throw new RuntimeException("Package manager has died", e);
336 }
337
338 throw new NameNotFoundException(className.toString());
339 }
340
341 @Override
342 public ServiceInfo getServiceInfo(ComponentName className, int flags)
343 throws NameNotFoundException {
344 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700345 ServiceInfo si = mPM.getServiceInfo(className, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800346 if (si != null) {
347 return si;
348 }
349 } catch (RemoteException e) {
350 throw new RuntimeException("Package manager has died", e);
351 }
352
353 throw new NameNotFoundException(className.toString());
354 }
355
356 @Override
357 public ProviderInfo getProviderInfo(ComponentName className, int flags)
358 throws NameNotFoundException {
359 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700360 ProviderInfo pi = mPM.getProviderInfo(className, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800361 if (pi != null) {
362 return pi;
363 }
364 } catch (RemoteException e) {
365 throw new RuntimeException("Package manager has died", e);
366 }
367
368 throw new NameNotFoundException(className.toString());
369 }
370
371 @Override
372 public String[] getSystemSharedLibraryNames() {
373 try {
374 return mPM.getSystemSharedLibraryNames();
375 } catch (RemoteException e) {
376 throw new RuntimeException("Package manager has died", e);
377 }
378 }
379
380 @Override
381 public FeatureInfo[] getSystemAvailableFeatures() {
382 try {
383 return mPM.getSystemAvailableFeatures();
384 } catch (RemoteException e) {
385 throw new RuntimeException("Package manager has died", e);
386 }
387 }
388
389 @Override
390 public boolean hasSystemFeature(String name) {
391 try {
392 return mPM.hasSystemFeature(name);
393 } catch (RemoteException e) {
394 throw new RuntimeException("Package manager has died", e);
395 }
396 }
397
398 @Override
399 public int checkPermission(String permName, String pkgName) {
400 try {
Svetoslavc6d1c342015-02-26 14:44:43 -0800401 return mPM.checkPermission(permName, pkgName, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800402 } catch (RemoteException e) {
403 throw new RuntimeException("Package manager has died", e);
404 }
405 }
406
407 @Override
408 public boolean addPermission(PermissionInfo info) {
409 try {
410 return mPM.addPermission(info);
411 } catch (RemoteException e) {
412 throw new RuntimeException("Package manager has died", e);
413 }
414 }
415
416 @Override
417 public boolean addPermissionAsync(PermissionInfo info) {
418 try {
419 return mPM.addPermissionAsync(info);
420 } catch (RemoteException e) {
421 throw new RuntimeException("Package manager has died", e);
422 }
423 }
424
425 @Override
426 public void removePermission(String name) {
427 try {
428 mPM.removePermission(name);
429 } catch (RemoteException e) {
430 throw new RuntimeException("Package manager has died", e);
431 }
432 }
433
434 @Override
Svetoslavc6d1c342015-02-26 14:44:43 -0800435 public void grantPermission(String packageName, String permissionName, UserHandle user) {
Dianne Hackborne639da72012-02-21 15:11:13 -0800436 try {
Svetoslavc6d1c342015-02-26 14:44:43 -0800437 mPM.grantPermission(packageName, permissionName, user.getIdentifier());
Dianne Hackborne639da72012-02-21 15:11:13 -0800438 } catch (RemoteException e) {
439 throw new RuntimeException("Package manager has died", e);
440 }
441 }
442
443 @Override
Svetoslavc6d1c342015-02-26 14:44:43 -0800444 public void revokePermission(String packageName, String permissionName, UserHandle user) {
Dianne Hackborne639da72012-02-21 15:11:13 -0800445 try {
Svetoslavc6d1c342015-02-26 14:44:43 -0800446 mPM.revokePermission(packageName, permissionName, user.getIdentifier());
Dianne Hackborne639da72012-02-21 15:11:13 -0800447 } catch (RemoteException e) {
448 throw new RuntimeException("Package manager has died", e);
449 }
450 }
451
452 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800453 public int checkSignatures(String pkg1, String pkg2) {
454 try {
455 return mPM.checkSignatures(pkg1, pkg2);
456 } catch (RemoteException e) {
457 throw new RuntimeException("Package manager has died", e);
458 }
459 }
460
461 @Override
462 public int checkSignatures(int uid1, int uid2) {
463 try {
464 return mPM.checkUidSignatures(uid1, uid2);
465 } catch (RemoteException e) {
466 throw new RuntimeException("Package manager has died", e);
467 }
468 }
469
470 @Override
471 public String[] getPackagesForUid(int uid) {
472 try {
473 return mPM.getPackagesForUid(uid);
474 } catch (RemoteException e) {
475 throw new RuntimeException("Package manager has died", e);
476 }
477 }
478
479 @Override
480 public String getNameForUid(int uid) {
481 try {
482 return mPM.getNameForUid(uid);
483 } catch (RemoteException e) {
484 throw new RuntimeException("Package manager has died", e);
485 }
486 }
487
488 @Override
489 public int getUidForSharedUser(String sharedUserName)
490 throws NameNotFoundException {
491 try {
492 int uid = mPM.getUidForSharedUser(sharedUserName);
493 if(uid != -1) {
494 return uid;
495 }
496 } catch (RemoteException e) {
497 throw new RuntimeException("Package manager has died", e);
498 }
499 throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
500 }
501
Kenny Roote6cd0c72011-05-19 12:48:14 -0700502 @SuppressWarnings("unchecked")
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800503 @Override
504 public List<PackageInfo> getInstalledPackages(int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700505 return getInstalledPackages(flags, mContext.getUserId());
Amith Yamasani151ec4c2012-09-07 19:25:16 -0700506 }
507
508 /** @hide */
509 @Override
510 public List<PackageInfo> getInstalledPackages(int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800511 try {
Dianne Hackbornd8e1dbb2013-01-17 17:47:37 -0800512 ParceledListSlice<PackageInfo> slice = mPM.getInstalledPackages(flags, userId);
513 return slice.getList();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800514 } catch (RemoteException e) {
515 throw new RuntimeException("Package manager has died", e);
516 }
517 }
518
Kenny Roote6cd0c72011-05-19 12:48:14 -0700519 @SuppressWarnings("unchecked")
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800520 @Override
Dianne Hackborne7991752013-01-16 17:56:46 -0800521 public List<PackageInfo> getPackagesHoldingPermissions(
522 String[] permissions, int flags) {
523 final int userId = mContext.getUserId();
524 try {
Dianne Hackbornd8e1dbb2013-01-17 17:47:37 -0800525 ParceledListSlice<PackageInfo> slice = mPM.getPackagesHoldingPermissions(
526 permissions, flags, userId);
527 return slice.getList();
Dianne Hackborne7991752013-01-16 17:56:46 -0800528 } catch (RemoteException e) {
529 throw new RuntimeException("Package manager has died", e);
530 }
531 }
532
533 @SuppressWarnings("unchecked")
534 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800535 public List<ApplicationInfo> getInstalledApplications(int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700536 final int userId = mContext.getUserId();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800537 try {
Dianne Hackbornd8e1dbb2013-01-17 17:47:37 -0800538 ParceledListSlice<ApplicationInfo> slice = mPM.getInstalledApplications(flags, userId);
539 return slice.getList();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800540 } catch (RemoteException e) {
541 throw new RuntimeException("Package manager has died", e);
542 }
543 }
544
545 @Override
546 public ResolveInfo resolveActivity(Intent intent, int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700547 return resolveActivityAsUser(intent, flags, mContext.getUserId());
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700548 }
549
550 @Override
551 public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800552 try {
553 return mPM.resolveIntent(
554 intent,
555 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700556 flags,
557 userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800558 } catch (RemoteException e) {
559 throw new RuntimeException("Package manager has died", e);
560 }
561 }
562
563 @Override
564 public List<ResolveInfo> queryIntentActivities(Intent intent,
565 int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700566 return queryIntentActivitiesAsUser(intent, flags, mContext.getUserId());
Amith Yamasani151ec4c2012-09-07 19:25:16 -0700567 }
568
569 /** @hide Same as above but for a specific user */
570 @Override
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700571 public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
Amith Yamasani151ec4c2012-09-07 19:25:16 -0700572 int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800573 try {
574 return mPM.queryIntentActivities(
575 intent,
576 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Amith Yamasani483f3b02012-03-13 16:08:00 -0700577 flags,
Amith Yamasani151ec4c2012-09-07 19:25:16 -0700578 userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800579 } catch (RemoteException e) {
580 throw new RuntimeException("Package manager has died", e);
581 }
582 }
583
584 @Override
585 public List<ResolveInfo> queryIntentActivityOptions(
586 ComponentName caller, Intent[] specifics, Intent intent,
587 int flags) {
588 final ContentResolver resolver = mContext.getContentResolver();
589
590 String[] specificTypes = null;
591 if (specifics != null) {
592 final int N = specifics.length;
593 for (int i=0; i<N; i++) {
594 Intent sp = specifics[i];
595 if (sp != null) {
596 String t = sp.resolveTypeIfNeeded(resolver);
597 if (t != null) {
598 if (specificTypes == null) {
599 specificTypes = new String[N];
600 }
601 specificTypes[i] = t;
602 }
603 }
604 }
605 }
606
607 try {
608 return mPM.queryIntentActivityOptions(caller, specifics,
609 specificTypes, intent, intent.resolveTypeIfNeeded(resolver),
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700610 flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800611 } catch (RemoteException e) {
612 throw new RuntimeException("Package manager has died", e);
613 }
614 }
615
Amith Yamasanif203aee2012-08-29 18:41:53 -0700616 /**
617 * @hide
618 */
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800619 @Override
Amith Yamasanif203aee2012-08-29 18:41:53 -0700620 public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800621 try {
622 return mPM.queryIntentReceivers(
623 intent,
624 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Amith Yamasani483f3b02012-03-13 16:08:00 -0700625 flags,
Amith Yamasanif203aee2012-08-29 18:41:53 -0700626 userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800627 } catch (RemoteException e) {
628 throw new RuntimeException("Package manager has died", e);
629 }
630 }
631
632 @Override
Amith Yamasanif203aee2012-08-29 18:41:53 -0700633 public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700634 return queryBroadcastReceivers(intent, flags, mContext.getUserId());
Amith Yamasanif203aee2012-08-29 18:41:53 -0700635 }
636
637 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800638 public ResolveInfo resolveService(Intent intent, int flags) {
639 try {
640 return mPM.resolveService(
641 intent,
642 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Amith Yamasani483f3b02012-03-13 16:08:00 -0700643 flags,
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700644 mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800645 } catch (RemoteException e) {
646 throw new RuntimeException("Package manager has died", e);
647 }
648 }
649
650 @Override
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700651 public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800652 try {
653 return mPM.queryIntentServices(
654 intent,
655 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Amith Yamasani483f3b02012-03-13 16:08:00 -0700656 flags,
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700657 userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800658 } catch (RemoteException e) {
659 throw new RuntimeException("Package manager has died", e);
660 }
661 }
662
663 @Override
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700664 public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700665 return queryIntentServicesAsUser(intent, flags, mContext.getUserId());
Svetoslav Ganov58d37b52012-09-18 12:04:19 -0700666 }
667
668 @Override
Jeff Sharkey85f5f812013-10-07 10:16:12 -0700669 public List<ResolveInfo> queryIntentContentProvidersAsUser(
670 Intent intent, int flags, int userId) {
671 try {
672 return mPM.queryIntentContentProviders(intent,
673 intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, userId);
674 } catch (RemoteException e) {
675 throw new RuntimeException("Package manager has died", e);
676 }
677 }
678
679 @Override
680 public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
681 return queryIntentContentProvidersAsUser(intent, flags, mContext.getUserId());
682 }
683
684 @Override
Alexandra Gherghina0363c3e2014-06-23 13:34:59 +0100685 public ProviderInfo resolveContentProvider(String name, int flags) {
686 return resolveContentProviderAsUser(name, flags, mContext.getUserId());
687 }
688
689 /** @hide **/
690 @Override
691 public ProviderInfo resolveContentProviderAsUser(String name, int flags, int userId) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800692 try {
Alexandra Gherghina0363c3e2014-06-23 13:34:59 +0100693 return mPM.resolveContentProvider(name, flags, userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800694 } catch (RemoteException e) {
695 throw new RuntimeException("Package manager has died", e);
696 }
697 }
698
699 @Override
700 public List<ProviderInfo> queryContentProviders(String processName,
701 int uid, int flags) {
702 try {
703 return mPM.queryContentProviders(processName, uid, flags);
704 } catch (RemoteException e) {
705 throw new RuntimeException("Package manager has died", e);
706 }
707 }
708
709 @Override
710 public InstrumentationInfo getInstrumentationInfo(
711 ComponentName className, int flags)
712 throws NameNotFoundException {
713 try {
714 InstrumentationInfo ii = mPM.getInstrumentationInfo(
715 className, flags);
716 if (ii != null) {
717 return ii;
718 }
719 } catch (RemoteException e) {
720 throw new RuntimeException("Package manager has died", e);
721 }
722
723 throw new NameNotFoundException(className.toString());
724 }
725
726 @Override
727 public List<InstrumentationInfo> queryInstrumentation(
728 String targetPackage, int flags) {
729 try {
730 return mPM.queryInstrumentation(targetPackage, flags);
731 } catch (RemoteException e) {
732 throw new RuntimeException("Package manager has died", e);
733 }
734 }
735
Tor Norbye7b9c9122013-05-30 16:48:33 -0700736 @Override public Drawable getDrawable(String packageName, @DrawableRes int resid,
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800737 ApplicationInfo appInfo) {
738 ResourceName name = new ResourceName(packageName, resid);
739 Drawable dr = getCachedIcon(name);
740 if (dr != null) {
741 return dr;
742 }
743 if (appInfo == null) {
744 try {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700745 appInfo = getApplicationInfo(packageName, sDefaultFlags);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800746 } catch (NameNotFoundException e) {
747 return null;
748 }
749 }
750 try {
751 Resources r = getResourcesForApplication(appInfo);
752 dr = r.getDrawable(resid);
753 if (false) {
754 RuntimeException e = new RuntimeException("here");
755 e.fillInStackTrace();
756 Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid)
757 + " from package " + packageName
758 + ": app scale=" + r.getCompatibilityInfo().applicationScale
759 + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale,
760 e);
761 }
762 if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x"
763 + Integer.toHexString(resid) + " from " + r
764 + ": " + dr);
765 putCachedIcon(name, dr);
766 return dr;
767 } catch (NameNotFoundException e) {
Dianne Hackbornaec68bb2014-08-20 15:25:13 -0700768 Log.w("PackageManager", "Failure retrieving resources for "
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800769 + appInfo.packageName);
Joe Onorato08f16542011-01-20 11:49:56 -0800770 } catch (Resources.NotFoundException e) {
Dianne Hackbornaec68bb2014-08-20 15:25:13 -0700771 Log.w("PackageManager", "Failure retrieving resources for "
Joe Onorato08f16542011-01-20 11:49:56 -0800772 + appInfo.packageName + ": " + e.getMessage());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800773 } catch (RuntimeException e) {
774 // If an exception was thrown, fall through to return
775 // default icon.
776 Log.w("PackageManager", "Failure retrieving icon 0x"
777 + Integer.toHexString(resid) + " in package "
778 + packageName, e);
779 }
780 return null;
781 }
782
783 @Override public Drawable getActivityIcon(ComponentName activityName)
784 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700785 return getActivityInfo(activityName, sDefaultFlags).loadIcon(this);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800786 }
787
788 @Override public Drawable getActivityIcon(Intent intent)
789 throws NameNotFoundException {
790 if (intent.getComponent() != null) {
791 return getActivityIcon(intent.getComponent());
792 }
793
794 ResolveInfo info = resolveActivity(
795 intent, PackageManager.MATCH_DEFAULT_ONLY);
796 if (info != null) {
797 return info.activityInfo.loadIcon(this);
798 }
799
Romain Guy39fe17c2011-11-30 10:34:07 -0800800 throw new NameNotFoundException(intent.toUri(0));
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800801 }
802
803 @Override public Drawable getDefaultActivityIcon() {
804 return Resources.getSystem().getDrawable(
805 com.android.internal.R.drawable.sym_def_app_icon);
806 }
807
808 @Override public Drawable getApplicationIcon(ApplicationInfo info) {
809 return info.loadIcon(this);
810 }
811
812 @Override public Drawable getApplicationIcon(String packageName)
813 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700814 return getApplicationIcon(getApplicationInfo(packageName, sDefaultFlags));
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800815 }
816
817 @Override
Jose Limaf78e3122014-03-06 12:13:15 -0800818 public Drawable getActivityBanner(ComponentName activityName)
819 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700820 return getActivityInfo(activityName, sDefaultFlags).loadBanner(this);
Jose Limaf78e3122014-03-06 12:13:15 -0800821 }
822
823 @Override
824 public Drawable getActivityBanner(Intent intent)
825 throws NameNotFoundException {
826 if (intent.getComponent() != null) {
827 return getActivityBanner(intent.getComponent());
828 }
829
830 ResolveInfo info = resolveActivity(
831 intent, PackageManager.MATCH_DEFAULT_ONLY);
832 if (info != null) {
833 return info.activityInfo.loadBanner(this);
834 }
835
836 throw new NameNotFoundException(intent.toUri(0));
837 }
838
839 @Override
840 public Drawable getApplicationBanner(ApplicationInfo info) {
841 return info.loadBanner(this);
842 }
843
844 @Override
845 public Drawable getApplicationBanner(String packageName)
846 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700847 return getApplicationBanner(getApplicationInfo(packageName, sDefaultFlags));
Jose Limaf78e3122014-03-06 12:13:15 -0800848 }
849
850 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800851 public Drawable getActivityLogo(ComponentName activityName)
852 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700853 return getActivityInfo(activityName, sDefaultFlags).loadLogo(this);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800854 }
855
856 @Override
857 public Drawable getActivityLogo(Intent intent)
858 throws NameNotFoundException {
859 if (intent.getComponent() != null) {
860 return getActivityLogo(intent.getComponent());
861 }
862
863 ResolveInfo info = resolveActivity(
864 intent, PackageManager.MATCH_DEFAULT_ONLY);
865 if (info != null) {
866 return info.activityInfo.loadLogo(this);
867 }
868
869 throw new NameNotFoundException(intent.toUri(0));
870 }
871
872 @Override
873 public Drawable getApplicationLogo(ApplicationInfo info) {
874 return info.loadLogo(this);
875 }
876
877 @Override
878 public Drawable getApplicationLogo(String packageName)
879 throws NameNotFoundException {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700880 return getApplicationLogo(getApplicationInfo(packageName, sDefaultFlags));
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800881 }
882
Svetoslavc7d62f02014-09-04 15:39:54 -0700883 @Override
884 public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
885 final int badgeResId = getBadgeResIdForUser(user.getIdentifier());
886 if (badgeResId == 0) {
887 return icon;
888 }
889 Drawable badgeIcon = getDrawable("system", badgeResId, null);
890 return getBadgedDrawable(icon, badgeIcon, null, true);
891 }
892
893 @Override
894 public Drawable getUserBadgedDrawableForDensity(Drawable drawable, UserHandle user,
895 Rect badgeLocation, int badgeDensity) {
896 Drawable badgeDrawable = getUserBadgeForDensity(user, badgeDensity);
897 if (badgeDrawable == null) {
898 return drawable;
899 }
900 return getBadgedDrawable(drawable, badgeDrawable, badgeLocation, true);
901 }
902
903 @Override
904 public Drawable getUserBadgeForDensity(UserHandle user, int density) {
905 UserInfo userInfo = getUserIfProfile(user.getIdentifier());
906 if (userInfo != null && userInfo.isManagedProfile()) {
907 if (density <= 0) {
908 density = mContext.getResources().getDisplayMetrics().densityDpi;
909 }
910 return Resources.getSystem().getDrawableForDensity(
911 com.android.internal.R.drawable.ic_corp_badge, density);
912 }
913 return null;
914 }
915
916 @Override
917 public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) {
918 UserInfo userInfo = getUserIfProfile(user.getIdentifier());
919 if (userInfo != null && userInfo.isManagedProfile()) {
920 return Resources.getSystem().getString(
921 com.android.internal.R.string.managed_profile_label_badge, label);
922 }
923 return label;
924 }
925
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800926 @Override public Resources getResourcesForActivity(
927 ComponentName activityName) throws NameNotFoundException {
928 return getResourcesForApplication(
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700929 getActivityInfo(activityName, sDefaultFlags).applicationInfo);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800930 }
931
932 @Override public Resources getResourcesForApplication(
933 ApplicationInfo app) throws NameNotFoundException {
934 if (app.packageName.equals("system")) {
935 return mContext.mMainThread.getSystemContext().getResources();
936 }
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700937 final boolean sameUid = (app.uid == Process.myUid());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800938 Resources r = mContext.mMainThread.getTopLevelResources(
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700939 sameUid ? app.sourceDir : app.publicSourceDir,
940 sameUid ? app.splitSourceDirs : app.splitPublicSourceDirs,
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700941 app.resourceDirs, app.sharedLibraryFiles, Display.DEFAULT_DISPLAY,
942 null, mContext.mPackageInfo);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800943 if (r != null) {
944 return r;
945 }
946 throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
947 }
948
949 @Override public Resources getResourcesForApplication(
950 String appPackageName) throws NameNotFoundException {
951 return getResourcesForApplication(
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700952 getApplicationInfo(appPackageName, sDefaultFlags));
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800953 }
954
Amith Yamasani98edc952012-09-25 14:09:27 -0700955 /** @hide */
956 @Override
957 public Resources getResourcesForApplicationAsUser(String appPackageName, int userId)
958 throws NameNotFoundException {
Jeff Sharkeyded653b2012-09-27 19:09:24 -0700959 if (userId < 0) {
960 throw new IllegalArgumentException(
961 "Call does not support special user #" + userId);
962 }
963 if ("system".equals(appPackageName)) {
964 return mContext.mMainThread.getSystemContext().getResources();
965 }
Amith Yamasani98edc952012-09-25 14:09:27 -0700966 try {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -0700967 ApplicationInfo ai = mPM.getApplicationInfo(appPackageName, sDefaultFlags, userId);
Amith Yamasani98edc952012-09-25 14:09:27 -0700968 if (ai != null) {
969 return getResourcesForApplication(ai);
970 }
971 } catch (RemoteException e) {
972 throw new RuntimeException("Package manager has died", e);
973 }
974 throw new NameNotFoundException("Package " + appPackageName + " doesn't exist");
975 }
976
Brad Fitzpatrick390dae12010-11-10 08:27:28 -0800977 int mCachedSafeMode = -1;
978 @Override public boolean isSafeMode() {
979 try {
980 if (mCachedSafeMode < 0) {
981 mCachedSafeMode = mPM.isSafeMode() ? 1 : 0;
982 }
983 return mCachedSafeMode != 0;
984 } catch (RemoteException e) {
985 throw new RuntimeException("Package manager has died", e);
986 }
987 }
988
989 static void configurationChanged() {
990 synchronized (sSync) {
991 sIconCache.clear();
992 sStringCache.clear();
993 }
994 }
995
996 ApplicationPackageManager(ContextImpl context,
997 IPackageManager pm) {
998 mContext = context;
999 mPM = pm;
1000 }
1001
1002 private Drawable getCachedIcon(ResourceName name) {
1003 synchronized (sSync) {
Romain Guy39fe17c2011-11-30 10:34:07 -08001004 WeakReference<Drawable.ConstantState> wr = sIconCache.get(name);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001005 if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for "
1006 + name + ": " + wr);
1007 if (wr != null) { // we have the activity
Romain Guy39fe17c2011-11-30 10:34:07 -08001008 Drawable.ConstantState state = wr.get();
1009 if (state != null) {
1010 if (DEBUG_ICONS) {
1011 Log.v(TAG, "Get cached drawable state for " + name + ": " + state);
1012 }
1013 // Note: It's okay here to not use the newDrawable(Resources) variant
1014 // of the API. The ConstantState comes from a drawable that was
1015 // originally created by passing the proper app Resources instance
1016 // which means the state should already contain the proper
1017 // resources specific information (like density.) See
1018 // BitmapDrawable.BitmapState for instance.
1019 return state.newDrawable();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001020 }
1021 // our entry has been purged
1022 sIconCache.remove(name);
1023 }
1024 }
1025 return null;
1026 }
1027
1028 private void putCachedIcon(ResourceName name, Drawable dr) {
1029 synchronized (sSync) {
Romain Guy39fe17c2011-11-30 10:34:07 -08001030 sIconCache.put(name, new WeakReference<Drawable.ConstantState>(dr.getConstantState()));
1031 if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable state for " + name + ": " + dr);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001032 }
1033 }
1034
Romain Guy39fe17c2011-11-30 10:34:07 -08001035 static void handlePackageBroadcast(int cmd, String[] pkgList, boolean hasPkgInfo) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001036 boolean immediateGc = false;
1037 if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) {
1038 immediateGc = true;
1039 }
1040 if (pkgList != null && (pkgList.length > 0)) {
1041 boolean needCleanup = false;
1042 for (String ssp : pkgList) {
1043 synchronized (sSync) {
Dianne Hackbornadd005c2013-07-17 18:43:12 -07001044 for (int i=sIconCache.size()-1; i>=0; i--) {
1045 ResourceName nm = sIconCache.keyAt(i);
1046 if (nm.packageName.equals(ssp)) {
1047 //Log.i(TAG, "Removing cached drawable for " + nm);
1048 sIconCache.removeAt(i);
1049 needCleanup = true;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001050 }
1051 }
Dianne Hackbornadd005c2013-07-17 18:43:12 -07001052 for (int i=sStringCache.size()-1; i>=0; i--) {
1053 ResourceName nm = sStringCache.keyAt(i);
1054 if (nm.packageName.equals(ssp)) {
1055 //Log.i(TAG, "Removing cached string for " + nm);
1056 sStringCache.removeAt(i);
1057 needCleanup = true;
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001058 }
1059 }
1060 }
1061 }
1062 if (needCleanup || hasPkgInfo) {
1063 if (immediateGc) {
1064 // Schedule an immediate gc.
1065 Runtime.getRuntime().gc();
1066 } else {
1067 ActivityThread.currentActivityThread().scheduleGcIdler();
1068 }
1069 }
1070 }
1071 }
1072
1073 private static final class ResourceName {
1074 final String packageName;
1075 final int iconId;
1076
1077 ResourceName(String _packageName, int _iconId) {
1078 packageName = _packageName;
1079 iconId = _iconId;
1080 }
1081
1082 ResourceName(ApplicationInfo aInfo, int _iconId) {
1083 this(aInfo.packageName, _iconId);
1084 }
1085
1086 ResourceName(ComponentInfo cInfo, int _iconId) {
1087 this(cInfo.applicationInfo.packageName, _iconId);
1088 }
1089
1090 ResourceName(ResolveInfo rInfo, int _iconId) {
1091 this(rInfo.activityInfo.applicationInfo.packageName, _iconId);
1092 }
1093
1094 @Override
1095 public boolean equals(Object o) {
1096 if (this == o) return true;
1097 if (o == null || getClass() != o.getClass()) return false;
1098
1099 ResourceName that = (ResourceName) o;
1100
1101 if (iconId != that.iconId) return false;
1102 return !(packageName != null ?
1103 !packageName.equals(that.packageName) : that.packageName != null);
1104
1105 }
1106
1107 @Override
1108 public int hashCode() {
1109 int result;
1110 result = packageName.hashCode();
1111 result = 31 * result + iconId;
1112 return result;
1113 }
1114
1115 @Override
1116 public String toString() {
1117 return "{ResourceName " + packageName + " / " + iconId + "}";
1118 }
1119 }
1120
1121 private CharSequence getCachedString(ResourceName name) {
1122 synchronized (sSync) {
1123 WeakReference<CharSequence> wr = sStringCache.get(name);
1124 if (wr != null) { // we have the activity
1125 CharSequence cs = wr.get();
1126 if (cs != null) {
1127 return cs;
1128 }
1129 // our entry has been purged
1130 sStringCache.remove(name);
1131 }
1132 }
1133 return null;
1134 }
1135
1136 private void putCachedString(ResourceName name, CharSequence cs) {
1137 synchronized (sSync) {
1138 sStringCache.put(name, new WeakReference<CharSequence>(cs));
1139 }
1140 }
1141
1142 @Override
Tor Norbye7b9c9122013-05-30 16:48:33 -07001143 public CharSequence getText(String packageName, @StringRes int resid,
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001144 ApplicationInfo appInfo) {
1145 ResourceName name = new ResourceName(packageName, resid);
1146 CharSequence text = getCachedString(name);
1147 if (text != null) {
1148 return text;
1149 }
1150 if (appInfo == null) {
1151 try {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -07001152 appInfo = getApplicationInfo(packageName, sDefaultFlags);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001153 } catch (NameNotFoundException e) {
1154 return null;
1155 }
1156 }
1157 try {
1158 Resources r = getResourcesForApplication(appInfo);
1159 text = r.getText(resid);
1160 putCachedString(name, text);
1161 return text;
1162 } catch (NameNotFoundException e) {
Dianne Hackbornaec68bb2014-08-20 15:25:13 -07001163 Log.w("PackageManager", "Failure retrieving resources for "
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001164 + appInfo.packageName);
1165 } catch (RuntimeException e) {
1166 // If an exception was thrown, fall through to return
1167 // default icon.
1168 Log.w("PackageManager", "Failure retrieving text 0x"
1169 + Integer.toHexString(resid) + " in package "
1170 + packageName, e);
1171 }
1172 return null;
1173 }
1174
1175 @Override
Tor Norbye7b9c9122013-05-30 16:48:33 -07001176 public XmlResourceParser getXml(String packageName, @XmlRes int resid,
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001177 ApplicationInfo appInfo) {
1178 if (appInfo == null) {
1179 try {
Adam Lesinskid00bb5e2014-10-07 12:14:45 -07001180 appInfo = getApplicationInfo(packageName, sDefaultFlags);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001181 } catch (NameNotFoundException e) {
1182 return null;
1183 }
1184 }
1185 try {
1186 Resources r = getResourcesForApplication(appInfo);
1187 return r.getXml(resid);
1188 } catch (RuntimeException e) {
1189 // If an exception was thrown, fall through to return
1190 // default icon.
1191 Log.w("PackageManager", "Failure retrieving xml 0x"
1192 + Integer.toHexString(resid) + " in package "
1193 + packageName, e);
1194 } catch (NameNotFoundException e) {
Alon Albert3fa51e32010-11-11 09:24:04 -08001195 Log.w("PackageManager", "Failure retrieving resources for "
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001196 + appInfo.packageName);
1197 }
1198 return null;
1199 }
1200
1201 @Override
1202 public CharSequence getApplicationLabel(ApplicationInfo info) {
1203 return info.loadLabel(this);
1204 }
1205
1206 @Override
1207 public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
1208 String installerPackageName) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001209 final VerificationParams verificationParams = new VerificationParams(null, null,
1210 null, VerificationParams.NO_UID, null);
1211 installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
1212 installerPackageName, verificationParams, null);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001213 }
1214
1215 @Override
Kenny Root5ab21572011-07-27 11:11:19 -07001216 public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
1217 int flags, String installerPackageName, Uri verificationURI,
Rich Canningse1d7c712012-08-08 12:46:06 -07001218 ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001219 final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
1220 null, VerificationParams.NO_UID, manifestDigest);
1221 installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
1222 installerPackageName, verificationParams, encryptionParams);
Kenny Root5ab21572011-07-27 11:11:19 -07001223 }
1224
1225 @Override
John Spurlock8a985d22014-02-25 09:40:05 -05001226 public void installPackageWithVerificationAndEncryption(Uri packageURI,
rich cannings706e8ba2012-08-20 13:20:14 -07001227 IPackageInstallObserver observer, int flags, String installerPackageName,
1228 VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001229 installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
1230 installerPackageName, verificationParams, encryptionParams);
Christopher Tatef1977b42014-03-24 16:25:51 -07001231 }
1232
Christopher Tatef1977b42014-03-24 16:25:51 -07001233 @Override
1234 public void installPackage(Uri packageURI, PackageInstallObserver observer,
1235 int flags, String installerPackageName) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001236 final VerificationParams verificationParams = new VerificationParams(null, null,
1237 null, VerificationParams.NO_UID, null);
1238 installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null);
Christopher Tatef1977b42014-03-24 16:25:51 -07001239 }
1240
1241 @Override
1242 public void installPackageWithVerification(Uri packageURI,
1243 PackageInstallObserver observer, int flags, String installerPackageName,
1244 Uri verificationURI, ManifestDigest manifestDigest,
1245 ContainerEncryptionParams encryptionParams) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001246 final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
1247 null, VerificationParams.NO_UID, manifestDigest);
1248 installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
1249 encryptionParams);
Christopher Tatef1977b42014-03-24 16:25:51 -07001250 }
1251
1252 @Override
1253 public void installPackageWithVerificationAndEncryption(Uri packageURI,
1254 PackageInstallObserver observer, int flags, String installerPackageName,
1255 VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001256 installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
1257 encryptionParams);
1258 }
1259
1260 private void installCommon(Uri packageURI,
1261 PackageInstallObserver observer, int flags, String installerPackageName,
1262 VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
1263 if (!"file".equals(packageURI.getScheme())) {
1264 throw new UnsupportedOperationException("Only file:// URIs are supported");
1265 }
1266 if (encryptionParams != null) {
1267 throw new UnsupportedOperationException("ContainerEncryptionParams not supported");
1268 }
1269
1270 final String originPath = packageURI.getPath();
Christopher Tatef1977b42014-03-24 16:25:51 -07001271 try {
Jeff Sharkey513a0742014-07-08 17:10:32 -07001272 mPM.installPackage(originPath, observer.getBinder(), flags, installerPackageName,
1273 verificationParams, null);
1274 } catch (RemoteException ignored) {
rich cannings706e8ba2012-08-20 13:20:14 -07001275 }
1276 }
1277
1278 @Override
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001279 public int installExistingPackage(String packageName)
1280 throws NameNotFoundException {
1281 try {
Amith Yamasani67df64b2012-12-14 12:09:36 -08001282 int res = mPM.installExistingPackageAsUser(packageName, UserHandle.myUserId());
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001283 if (res == INSTALL_FAILED_INVALID_URI) {
1284 throw new NameNotFoundException("Package " + packageName + " doesn't exist");
1285 }
1286 return res;
1287 } catch (RemoteException e) {
1288 // Should never happen!
1289 throw new NameNotFoundException("Package " + packageName + " doesn't exist");
1290 }
1291 }
1292
1293 @Override
Kenny Root3a9b5fb2011-09-20 14:15:38 -07001294 public void verifyPendingInstall(int id, int response) {
Kenny Root5ab21572011-07-27 11:11:19 -07001295 try {
Kenny Root3a9b5fb2011-09-20 14:15:38 -07001296 mPM.verifyPendingInstall(id, response);
Kenny Root5ab21572011-07-27 11:11:19 -07001297 } catch (RemoteException e) {
1298 // Should never happen!
1299 }
1300 }
1301
1302 @Override
rich canningsd9ef3e52012-08-22 14:28:05 -07001303 public void extendVerificationTimeout(int id, int verificationCodeAtTimeout,
1304 long millisecondsToDelay) {
1305 try {
1306 mPM.extendVerificationTimeout(id, verificationCodeAtTimeout, millisecondsToDelay);
1307 } catch (RemoteException e) {
1308 // Should never happen!
1309 }
1310 }
1311
1312 @Override
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001313 public void verifyIntentFilter(int id, int verificationCode, List<String> outFailedDomains) {
1314 try {
1315 mPM.verifyIntentFilter(id, verificationCode, outFailedDomains);
1316 } catch (RemoteException e) {
1317 // Should never happen!
1318 }
1319 }
1320
1321 @Override
1322 public int getIntentVerificationStatus(String packageName, int userId) {
1323 try {
1324 return mPM.getIntentVerificationStatus(packageName, userId);
1325 } catch (RemoteException e) {
1326 // Should never happen!
1327 return PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
1328 }
1329 }
1330
1331 @Override
1332 public boolean updateIntentVerificationStatus(String packageName, int status, int userId) {
1333 try {
1334 return mPM.updateIntentVerificationStatus(packageName, status, userId);
1335 } catch (RemoteException e) {
1336 // Should never happen!
1337 return false;
1338 }
1339 }
1340
1341 @Override
1342 public List<IntentFilterVerificationInfo> getIntentFilterVerifications(String packageName) {
1343 try {
1344 return mPM.getIntentFilterVerifications(packageName);
1345 } catch (RemoteException e) {
1346 // Should never happen!
1347 return null;
1348 }
1349 }
1350
1351 @Override
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001352 public List<IntentFilter> getAllIntentFilters(String packageName) {
1353 try {
1354 return mPM.getAllIntentFilters(packageName);
1355 } catch (RemoteException e) {
1356 // Should never happen!
1357 return null;
1358 }
1359 }
1360
1361 @Override
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001362 public String getDefaultBrowserPackageName(int userId) {
1363 try {
1364 return mPM.getDefaultBrowserPackageName(userId);
1365 } catch (RemoteException e) {
1366 // Should never happen!
1367 return null;
1368 }
1369 }
1370
1371 @Override
1372 public boolean setDefaultBrowserPackageName(String packageName, int userId) {
1373 try {
1374 return mPM.setDefaultBrowserPackageName(packageName, userId);
1375 } catch (RemoteException e) {
1376 // Should never happen!
1377 return false;
1378 }
1379 }
1380
1381 @Override
Dianne Hackborn880119b2010-11-18 22:26:40 -08001382 public void setInstallerPackageName(String targetPackage,
1383 String installerPackageName) {
1384 try {
1385 mPM.setInstallerPackageName(targetPackage, installerPackageName);
1386 } catch (RemoteException e) {
1387 // Should never happen!
1388 }
1389 }
1390
1391 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001392 public void movePackage(String packageName, IPackageMoveObserver observer, int flags) {
1393 try {
1394 mPM.movePackage(packageName, observer, flags);
1395 } catch (RemoteException e) {
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07001396 throw e.rethrowAsRuntimeException();
1397 }
1398 }
1399
1400 @Override
1401 public void movePackageAndData(String packageName, String volumeUuid,
1402 IPackageMoveObserver observer) {
1403 try {
1404 mPM.movePackageAndData(packageName, volumeUuid, observer);
1405 } catch (RemoteException e) {
1406 throw e.rethrowAsRuntimeException();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001407 }
1408 }
1409
1410 @Override
1411 public String getInstallerPackageName(String packageName) {
1412 try {
1413 return mPM.getInstallerPackageName(packageName);
1414 } catch (RemoteException e) {
1415 // Should never happen!
1416 }
1417 return null;
1418 }
1419
1420 @Override
1421 public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
1422 try {
Amith Yamasani67df64b2012-12-14 12:09:36 -08001423 mPM.deletePackageAsUser(packageName, observer, UserHandle.myUserId(), flags);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001424 } catch (RemoteException e) {
1425 // Should never happen!
1426 }
1427 }
Jeff Sharkeyfbd0e9f2014-08-06 16:34:34 -07001428
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001429 @Override
1430 public void clearApplicationUserData(String packageName,
1431 IPackageDataObserver observer) {
1432 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001433 mPM.clearApplicationUserData(packageName, observer, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001434 } catch (RemoteException e) {
1435 // Should never happen!
1436 }
1437 }
1438 @Override
1439 public void deleteApplicationCacheFiles(String packageName,
1440 IPackageDataObserver observer) {
1441 try {
1442 mPM.deleteApplicationCacheFiles(packageName, observer);
1443 } catch (RemoteException e) {
1444 // Should never happen!
1445 }
1446 }
1447 @Override
1448 public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) {
1449 try {
1450 mPM.freeStorageAndNotify(idealStorageSize, observer);
1451 } catch (RemoteException e) {
1452 // Should never happen!
1453 }
1454 }
1455
1456 @Override
1457 public void freeStorage(long freeStorageSize, IntentSender pi) {
1458 try {
1459 mPM.freeStorage(freeStorageSize, pi);
1460 } catch (RemoteException e) {
1461 // Should never happen!
1462 }
1463 }
1464
1465 @Override
Dianne Hackborn0c380492012-08-20 17:23:30 -07001466 public void getPackageSizeInfo(String packageName, int userHandle,
1467 IPackageStatsObserver observer) {
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001468 try {
Dianne Hackborn0c380492012-08-20 17:23:30 -07001469 mPM.getPackageSizeInfo(packageName, userHandle, observer);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001470 } catch (RemoteException e) {
1471 // Should never happen!
1472 }
1473 }
1474 @Override
1475 public void addPackageToPreferred(String packageName) {
1476 try {
1477 mPM.addPackageToPreferred(packageName);
1478 } catch (RemoteException e) {
1479 // Should never happen!
1480 }
1481 }
1482
1483 @Override
1484 public void removePackageFromPreferred(String packageName) {
1485 try {
1486 mPM.removePackageFromPreferred(packageName);
1487 } catch (RemoteException e) {
1488 // Should never happen!
1489 }
1490 }
1491
1492 @Override
1493 public List<PackageInfo> getPreferredPackages(int flags) {
1494 try {
1495 return mPM.getPreferredPackages(flags);
1496 } catch (RemoteException e) {
1497 // Should never happen!
1498 }
1499 return new ArrayList<PackageInfo>();
1500 }
1501
1502 @Override
1503 public void addPreferredActivity(IntentFilter filter,
1504 int match, ComponentName[] set, ComponentName activity) {
1505 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001506 mPM.addPreferredActivity(filter, match, set, activity, mContext.getUserId());
Amith Yamasania3f133a2012-08-09 17:11:28 -07001507 } catch (RemoteException e) {
1508 // Should never happen!
1509 }
1510 }
1511
1512 @Override
1513 public void addPreferredActivity(IntentFilter filter, int match,
1514 ComponentName[] set, ComponentName activity, int userId) {
1515 try {
1516 mPM.addPreferredActivity(filter, match, set, activity, userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001517 } catch (RemoteException e) {
1518 // Should never happen!
1519 }
1520 }
1521
1522 @Override
1523 public void replacePreferredActivity(IntentFilter filter,
1524 int match, ComponentName[] set, ComponentName activity) {
1525 try {
Amith Yamasani41c1ded2014-08-05 11:15:05 -07001526 mPM.replacePreferredActivity(filter, match, set, activity, UserHandle.myUserId());
1527 } catch (RemoteException e) {
1528 // Should never happen!
1529 }
1530 }
1531
1532 @Override
1533 public void replacePreferredActivityAsUser(IntentFilter filter,
1534 int match, ComponentName[] set, ComponentName activity,
1535 int userId) {
1536 try {
1537 mPM.replacePreferredActivity(filter, match, set, activity, userId);
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001538 } catch (RemoteException e) {
1539 // Should never happen!
1540 }
1541 }
1542
1543 @Override
1544 public void clearPackagePreferredActivities(String packageName) {
1545 try {
1546 mPM.clearPackagePreferredActivities(packageName);
1547 } catch (RemoteException e) {
1548 // Should never happen!
1549 }
1550 }
1551
1552 @Override
1553 public int getPreferredActivities(List<IntentFilter> outFilters,
1554 List<ComponentName> outActivities, String packageName) {
1555 try {
1556 return mPM.getPreferredActivities(outFilters, outActivities, packageName);
1557 } catch (RemoteException e) {
1558 // Should never happen!
1559 }
1560 return 0;
1561 }
1562
1563 @Override
Christopher Tatea2a0850d2013-09-05 16:38:58 -07001564 public ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
1565 try {
1566 return mPM.getHomeActivities(outActivities);
1567 } catch (RemoteException e) {
1568 // Should never happen!
1569 }
1570 return null;
1571 }
1572
1573 @Override
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001574 public void setComponentEnabledSetting(ComponentName componentName,
1575 int newState, int flags) {
1576 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001577 mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001578 } catch (RemoteException e) {
1579 // Should never happen!
1580 }
1581 }
1582
1583 @Override
1584 public int getComponentEnabledSetting(ComponentName componentName) {
1585 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001586 return mPM.getComponentEnabledSetting(componentName, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001587 } catch (RemoteException e) {
1588 // Should never happen!
1589 }
1590 return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
1591 }
1592
1593 @Override
1594 public void setApplicationEnabledSetting(String packageName,
1595 int newState, int flags) {
1596 try {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07001597 mPM.setApplicationEnabledSetting(packageName, newState, flags,
Dianne Hackborn95d78532013-09-11 09:51:14 -07001598 mContext.getUserId(), mContext.getOpPackageName());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001599 } catch (RemoteException e) {
1600 // Should never happen!
1601 }
1602 }
1603
1604 @Override
1605 public int getApplicationEnabledSetting(String packageName) {
1606 try {
Jeff Sharkeyded653b2012-09-27 19:09:24 -07001607 return mPM.getApplicationEnabledSetting(packageName, mContext.getUserId());
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001608 } catch (RemoteException e) {
1609 // Should never happen!
1610 }
1611 return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
1612 }
1613
Amith Yamasani655d0e22013-06-12 14:19:10 -07001614 @Override
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001615 public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden,
Amith Yamasani655d0e22013-06-12 14:19:10 -07001616 UserHandle user) {
1617 try {
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001618 return mPM.setApplicationHiddenSettingAsUser(packageName, hidden,
Amith Yamasani655d0e22013-06-12 14:19:10 -07001619 user.getIdentifier());
1620 } catch (RemoteException re) {
1621 // Should never happen!
1622 }
1623 return false;
1624 }
1625
1626 @Override
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001627 public boolean getApplicationHiddenSettingAsUser(String packageName, UserHandle user) {
Amith Yamasani655d0e22013-06-12 14:19:10 -07001628 try {
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001629 return mPM.getApplicationHiddenSettingAsUser(packageName, user.getIdentifier());
Amith Yamasani655d0e22013-06-12 14:19:10 -07001630 } catch (RemoteException re) {
1631 // Should never happen!
1632 }
1633 return false;
1634 }
1635
dcashmanc6f22492014-08-14 09:54:51 -07001636 /** @hide */
dcashman9d2f4412014-06-09 09:27:54 -07001637 @Override
1638 public KeySet getKeySetByAlias(String packageName, String alias) {
1639 Preconditions.checkNotNull(packageName);
1640 Preconditions.checkNotNull(alias);
dcashmanc6f22492014-08-14 09:54:51 -07001641 KeySet ks;
dcashman9d2f4412014-06-09 09:27:54 -07001642 try {
dcashmanc6f22492014-08-14 09:54:51 -07001643 ks = mPM.getKeySetByAlias(packageName, alias);
dcashman9d2f4412014-06-09 09:27:54 -07001644 } catch (RemoteException e) {
1645 return null;
1646 }
dcashmanc6f22492014-08-14 09:54:51 -07001647 return ks;
dcashman9d2f4412014-06-09 09:27:54 -07001648 }
1649
dcashmanc6f22492014-08-14 09:54:51 -07001650 /** @hide */
dcashman9d2f4412014-06-09 09:27:54 -07001651 @Override
1652 public KeySet getSigningKeySet(String packageName) {
1653 Preconditions.checkNotNull(packageName);
dcashmanc6f22492014-08-14 09:54:51 -07001654 KeySet ks;
dcashman9d2f4412014-06-09 09:27:54 -07001655 try {
dcashmanc6f22492014-08-14 09:54:51 -07001656 ks = mPM.getSigningKeySet(packageName);
dcashman9d2f4412014-06-09 09:27:54 -07001657 } catch (RemoteException e) {
1658 return null;
1659 }
dcashmanc6f22492014-08-14 09:54:51 -07001660 return ks;
dcashman9d2f4412014-06-09 09:27:54 -07001661 }
1662
dcashmanc6f22492014-08-14 09:54:51 -07001663 /** @hide */
dcashman9d2f4412014-06-09 09:27:54 -07001664 @Override
1665 public boolean isSignedBy(String packageName, KeySet ks) {
1666 Preconditions.checkNotNull(packageName);
1667 Preconditions.checkNotNull(ks);
dcashman9d2f4412014-06-09 09:27:54 -07001668 try {
dcashmanc6f22492014-08-14 09:54:51 -07001669 return mPM.isPackageSignedByKeySet(packageName, ks);
dcashman9d2f4412014-06-09 09:27:54 -07001670 } catch (RemoteException e) {
1671 return false;
1672 }
1673 }
1674
dcashmanc6f22492014-08-14 09:54:51 -07001675 /** @hide */
dcashman9d2f4412014-06-09 09:27:54 -07001676 @Override
1677 public boolean isSignedByExactly(String packageName, KeySet ks) {
1678 Preconditions.checkNotNull(packageName);
1679 Preconditions.checkNotNull(ks);
dcashman9d2f4412014-06-09 09:27:54 -07001680 try {
dcashmanc6f22492014-08-14 09:54:51 -07001681 return mPM.isPackageSignedByKeySetExactly(packageName, ks);
dcashman9d2f4412014-06-09 09:27:54 -07001682 } catch (RemoteException e) {
1683 return false;
1684 }
1685 }
1686
Kenny Root0aaa0d92011-09-12 16:42:55 -07001687 /**
1688 * @hide
1689 */
1690 @Override
1691 public VerifierDeviceIdentity getVerifierDeviceIdentity() {
1692 try {
1693 return mPM.getVerifierDeviceIdentity();
1694 } catch (RemoteException e) {
1695 // Should never happen!
1696 }
1697 return null;
1698 }
1699
Jeff Hao9f60c082014-10-28 18:51:07 -07001700 /**
1701 * @hide
1702 */
1703 @Override
1704 public boolean isUpgrade() {
1705 try {
1706 return mPM.isUpgrade();
1707 } catch (RemoteException e) {
1708 return false;
1709 }
1710 }
1711
Jeff Sharkey3a44f3f2014-04-28 17:36:31 -07001712 @Override
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -07001713 public PackageInstaller getPackageInstaller() {
1714 synchronized (mLock) {
1715 if (mInstaller == null) {
1716 try {
Jeff Sharkeya0907432014-08-15 10:23:11 -07001717 mInstaller = new PackageInstaller(mContext, this, mPM.getPackageInstaller(),
Jeff Sharkey16c8e3f2014-07-24 17:08:17 -07001718 mContext.getPackageName(), mContext.getUserId());
1719 } catch (RemoteException e) {
1720 throw e.rethrowAsRuntimeException();
1721 }
1722 }
1723 return mInstaller;
Jeff Sharkey3a44f3f2014-04-28 17:36:31 -07001724 }
1725 }
1726
Jeff Sharkey6c833e02014-07-14 22:44:30 -07001727 @Override
1728 public boolean isPackageAvailable(String packageName) {
1729 try {
1730 return mPM.isPackageAvailable(packageName, mContext.getUserId());
1731 } catch (RemoteException e) {
1732 throw e.rethrowAsRuntimeException();
1733 }
1734 }
1735
Nicolas Prevotc79586e2014-05-06 12:47:57 +01001736 /**
1737 * @hide
1738 */
1739 @Override
Nicolas Prevot63798c52014-05-27 13:22:38 +01001740 public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, int targetUserId,
1741 int flags) {
Nicolas Prevotc79586e2014-05-06 12:47:57 +01001742 try {
Nicolas Prevot3f7777f2014-07-24 15:58:39 +01001743 mPM.addCrossProfileIntentFilter(filter, mContext.getOpPackageName(),
Nicolas Prevot4b8d5822015-03-05 15:20:49 +00001744 sourceUserId, targetUserId, flags);
Nicolas Prevotc79586e2014-05-06 12:47:57 +01001745 } catch (RemoteException e) {
1746 // Should never happen!
1747 }
1748 }
1749
1750 /**
1751 * @hide
1752 */
1753 @Override
Nicolas Prevot81948992014-05-16 18:25:26 +01001754 public void clearCrossProfileIntentFilters(int sourceUserId) {
Nicolas Prevotc79586e2014-05-06 12:47:57 +01001755 try {
Nicolas Prevot4b8d5822015-03-05 15:20:49 +00001756 mPM.clearCrossProfileIntentFilters(sourceUserId, mContext.getOpPackageName());
Nicolas Prevotc79586e2014-05-06 12:47:57 +01001757 } catch (RemoteException e) {
1758 // Should never happen!
1759 }
1760 }
1761
Nicolas Prevot88cc3462014-05-14 14:51:48 +01001762 /**
1763 * @hide
1764 */
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +01001765 public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
Benjamin Franzec2d48b2014-10-01 15:38:43 +01001766 Drawable dr = loadUnbadgedItemIcon(itemInfo, appInfo);
1767 if (itemInfo.showUserIcon != UserHandle.USER_NULL) {
1768 return dr;
1769 }
1770 return getUserBadgedIcon(dr, new UserHandle(mContext.getUserId()));
1771 }
1772
1773 /**
1774 * @hide
1775 */
1776 public Drawable loadUnbadgedItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +01001777 if (itemInfo.showUserIcon != UserHandle.USER_NULL) {
Alexandra Gherghina64d4dca2014-08-28 18:26:56 +01001778 Bitmap bitmap = getUserManager().getUserIcon(itemInfo.showUserIcon);
1779 if (bitmap == null) {
1780 return UserIcons.getDefaultUserIcon(itemInfo.showUserIcon, /* light= */ false);
1781 }
1782 return new BitmapDrawable(bitmap);
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +01001783 }
Alexandra Gherghinadb811db2014-08-29 13:43:59 +01001784 Drawable dr = null;
1785 if (itemInfo.packageName != null) {
1786 dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo);
1787 }
Alexandra Gherghinaa71e3902014-07-25 20:03:47 +01001788 if (dr == null) {
Alexandra Gherghinaa7093142014-07-30 13:43:39 +01001789 dr = itemInfo.loadDefaultIcon(this);
Nicolas Prevot7f7b0c72014-06-23 15:59:38 +01001790 }
Benjamin Franzec2d48b2014-10-01 15:38:43 +01001791 return dr;
Svetoslavc7d62f02014-09-04 15:39:54 -07001792 }
1793
1794 private Drawable getBadgedDrawable(Drawable drawable, Drawable badgeDrawable,
1795 Rect badgeLocation, boolean tryBadgeInPlace) {
1796 final int badgedWidth = drawable.getIntrinsicWidth();
1797 final int badgedHeight = drawable.getIntrinsicHeight();
1798 final boolean canBadgeInPlace = tryBadgeInPlace
1799 && (drawable instanceof BitmapDrawable)
1800 && ((BitmapDrawable) drawable).getBitmap().isMutable();
1801
1802 final Bitmap bitmap;
1803 if (canBadgeInPlace) {
1804 bitmap = ((BitmapDrawable) drawable).getBitmap();
1805 } else {
1806 bitmap = Bitmap.createBitmap(badgedWidth, badgedHeight, Bitmap.Config.ARGB_8888);
1807 }
1808 Canvas canvas = new Canvas(bitmap);
1809
1810 if (!canBadgeInPlace) {
1811 drawable.setBounds(0, 0, badgedWidth, badgedHeight);
1812 drawable.draw(canvas);
1813 }
1814
1815 if (badgeLocation != null) {
1816 if (badgeLocation.left < 0 || badgeLocation.top < 0
1817 || badgeLocation.width() > badgedWidth || badgeLocation.height() > badgedHeight) {
1818 throw new IllegalArgumentException("Badge location " + badgeLocation
1819 + " not in badged drawable bounds "
1820 + new Rect(0, 0, badgedWidth, badgedHeight));
1821 }
1822 badgeDrawable.setBounds(0, 0, badgeLocation.width(), badgeLocation.height());
1823
1824 canvas.save();
1825 canvas.translate(badgeLocation.left, badgeLocation.top);
1826 badgeDrawable.draw(canvas);
1827 canvas.restore();
1828 } else {
1829 badgeDrawable.setBounds(0, 0, badgedWidth, badgedHeight);
1830 badgeDrawable.draw(canvas);
1831 }
1832
1833 if (!canBadgeInPlace) {
1834 BitmapDrawable mergedDrawable = new BitmapDrawable(mContext.getResources(), bitmap);
1835
1836 if (drawable instanceof BitmapDrawable) {
1837 BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
1838 mergedDrawable.setTargetDensity(bitmapDrawable.getBitmap().getDensity());
1839 }
1840
1841 return mergedDrawable;
1842 }
1843
1844 return drawable;
1845 }
1846
1847 private int getBadgeResIdForUser(int userHandle) {
1848 // Return the framework-provided badge.
1849 UserInfo userInfo = getUserIfProfile(userHandle);
1850 if (userInfo != null && userInfo.isManagedProfile()) {
1851 return com.android.internal.R.drawable.ic_corp_icon_badge;
1852 }
1853 return 0;
1854 }
1855
1856 private UserInfo getUserIfProfile(int userHandle) {
Svetoslav7de2abb2014-09-05 11:28:00 -07001857 List<UserInfo> userProfiles = getUserManager().getProfiles(UserHandle.myUserId());
Svetoslavc7d62f02014-09-04 15:39:54 -07001858 for (UserInfo user : userProfiles) {
1859 if (user.id == userHandle) {
1860 return user;
1861 }
1862 }
1863 return null;
Nicolas Prevot88cc3462014-05-14 14:51:48 +01001864 }
1865
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001866 private final ContextImpl mContext;
1867 private final IPackageManager mPM;
1868
1869 private static final Object sSync = new Object();
Dianne Hackbornadd005c2013-07-17 18:43:12 -07001870 private static ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>> sIconCache
1871 = new ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>>();
1872 private static ArrayMap<ResourceName, WeakReference<CharSequence>> sStringCache
1873 = new ArrayMap<ResourceName, WeakReference<CharSequence>>();
Brad Fitzpatrick390dae12010-11-10 08:27:28 -08001874}