1 /* 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 17 package android.app; 18 19 import android.content.ComponentName; 20 import android.content.ContentResolver; 21 import android.content.Intent; 22 import android.content.IntentFilter; 23 import android.content.IntentSender; 24 import android.content.pm.ActivityInfo; 25 import android.content.pm.ApplicationInfo; 26 import android.content.pm.ComponentInfo; 27 import android.content.pm.ContainerEncryptionParams; 28 import android.content.pm.FeatureInfo; 29 import android.content.pm.IPackageDataObserver; 30 import android.content.pm.IPackageDeleteObserver; 31 import android.content.pm.IPackageInstallObserver; 32 import android.content.pm.IPackageManager; 33 import android.content.pm.IPackageMoveObserver; 34 import android.content.pm.IPackageStatsObserver; 35 import android.content.pm.InstrumentationInfo; 36 import android.content.pm.PackageInfo; 37 import android.content.pm.PackageManager; 38 import android.content.pm.ParceledListSlice; 39 import android.content.pm.PermissionGroupInfo; 40 import android.content.pm.PermissionInfo; 41 import android.content.pm.ProviderInfo; 42 import android.content.pm.ResolveInfo; 43 import android.content.pm.ServiceInfo; 44 import android.content.pm.ManifestDigest; 45 import android.content.pm.VerificationParams; 46 import android.content.pm.VerifierDeviceIdentity; 47 import android.content.res.Resources; 48 import android.content.res.XmlResourceParser; 49 import android.graphics.drawable.Drawable; 50 import android.net.Uri; 51 import android.os.Process; 52 import android.os.RemoteException; 53 import android.os.UserHandle; 54 import android.util.Log; 55 import android.view.Display; 56 57 import java.lang.ref.WeakReference; 58 import java.util.ArrayList; 59 import java.util.HashMap; 60 import java.util.Iterator; 61 import java.util.List; 62 63 /*package*/ 64 final class ApplicationPackageManager extends PackageManager { 65 private static final String TAG = "ApplicationPackageManager"; 66 private final static boolean DEBUG = false; 67 private final static boolean DEBUG_ICONS = false; 68 69 @Override getPackageInfo(String packageName, int flags)70 public PackageInfo getPackageInfo(String packageName, int flags) 71 throws NameNotFoundException { 72 try { 73 PackageInfo pi = mPM.getPackageInfo(packageName, flags, mContext.getUserId()); 74 if (pi != null) { 75 return pi; 76 } 77 } catch (RemoteException e) { 78 throw new RuntimeException("Package manager has died", e); 79 } 80 81 throw new NameNotFoundException(packageName); 82 } 83 84 @Override currentToCanonicalPackageNames(String[] names)85 public String[] currentToCanonicalPackageNames(String[] names) { 86 try { 87 return mPM.currentToCanonicalPackageNames(names); 88 } catch (RemoteException e) { 89 throw new RuntimeException("Package manager has died", e); 90 } 91 } 92 93 @Override canonicalToCurrentPackageNames(String[] names)94 public String[] canonicalToCurrentPackageNames(String[] names) { 95 try { 96 return mPM.canonicalToCurrentPackageNames(names); 97 } catch (RemoteException e) { 98 throw new RuntimeException("Package manager has died", e); 99 } 100 } 101 102 @Override getLaunchIntentForPackage(String packageName)103 public Intent getLaunchIntentForPackage(String packageName) { 104 // First see if the package has an INFO activity; the existence of 105 // such an activity is implied to be the desired front-door for the 106 // overall package (such as if it has multiple launcher entries). 107 Intent intentToResolve = new Intent(Intent.ACTION_MAIN); 108 intentToResolve.addCategory(Intent.CATEGORY_INFO); 109 intentToResolve.setPackage(packageName); 110 List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0); 111 112 // Otherwise, try to find a main launcher activity. 113 if (ris == null || ris.size() <= 0) { 114 // reuse the intent instance 115 intentToResolve.removeCategory(Intent.CATEGORY_INFO); 116 intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); 117 intentToResolve.setPackage(packageName); 118 ris = queryIntentActivities(intentToResolve, 0); 119 } 120 if (ris == null || ris.size() <= 0) { 121 return null; 122 } 123 Intent intent = new Intent(intentToResolve); 124 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 125 intent.setClassName(ris.get(0).activityInfo.packageName, 126 ris.get(0).activityInfo.name); 127 return intent; 128 } 129 130 @Override getPackageGids(String packageName)131 public int[] getPackageGids(String packageName) 132 throws NameNotFoundException { 133 try { 134 int[] gids = mPM.getPackageGids(packageName); 135 if (gids == null || gids.length > 0) { 136 return gids; 137 } 138 } catch (RemoteException e) { 139 throw new RuntimeException("Package manager has died", e); 140 } 141 142 throw new NameNotFoundException(packageName); 143 } 144 145 @Override getPackageUid(String packageName, int userHandle)146 public int getPackageUid(String packageName, int userHandle) 147 throws NameNotFoundException { 148 try { 149 int uid = mPM.getPackageUid(packageName, userHandle); 150 if (uid >= 0) { 151 return uid; 152 } 153 } catch (RemoteException e) { 154 throw new RuntimeException("Package manager has died", e); 155 } 156 157 throw new NameNotFoundException(packageName); 158 } 159 160 @Override getPermissionInfo(String name, int flags)161 public PermissionInfo getPermissionInfo(String name, int flags) 162 throws NameNotFoundException { 163 try { 164 PermissionInfo pi = mPM.getPermissionInfo(name, flags); 165 if (pi != null) { 166 return pi; 167 } 168 } catch (RemoteException e) { 169 throw new RuntimeException("Package manager has died", e); 170 } 171 172 throw new NameNotFoundException(name); 173 } 174 175 @Override queryPermissionsByGroup(String group, int flags)176 public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) 177 throws NameNotFoundException { 178 try { 179 List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags); 180 if (pi != null) { 181 return pi; 182 } 183 } catch (RemoteException e) { 184 throw new RuntimeException("Package manager has died", e); 185 } 186 187 throw new NameNotFoundException(group); 188 } 189 190 @Override getPermissionGroupInfo(String name, int flags)191 public PermissionGroupInfo getPermissionGroupInfo(String name, 192 int flags) throws NameNotFoundException { 193 try { 194 PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags); 195 if (pgi != null) { 196 return pgi; 197 } 198 } catch (RemoteException e) { 199 throw new RuntimeException("Package manager has died", e); 200 } 201 202 throw new NameNotFoundException(name); 203 } 204 205 @Override getAllPermissionGroups(int flags)206 public List<PermissionGroupInfo> getAllPermissionGroups(int flags) { 207 try { 208 return mPM.getAllPermissionGroups(flags); 209 } catch (RemoteException e) { 210 throw new RuntimeException("Package manager has died", e); 211 } 212 } 213 214 @Override getApplicationInfo(String packageName, int flags)215 public ApplicationInfo getApplicationInfo(String packageName, int flags) 216 throws NameNotFoundException { 217 try { 218 ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, mContext.getUserId()); 219 if (ai != null) { 220 return ai; 221 } 222 } catch (RemoteException e) { 223 throw new RuntimeException("Package manager has died", e); 224 } 225 226 throw new NameNotFoundException(packageName); 227 } 228 229 @Override getActivityInfo(ComponentName className, int flags)230 public ActivityInfo getActivityInfo(ComponentName className, int flags) 231 throws NameNotFoundException { 232 try { 233 ActivityInfo ai = mPM.getActivityInfo(className, flags, mContext.getUserId()); 234 if (ai != null) { 235 return ai; 236 } 237 } catch (RemoteException e) { 238 throw new RuntimeException("Package manager has died", e); 239 } 240 241 throw new NameNotFoundException(className.toString()); 242 } 243 244 @Override getReceiverInfo(ComponentName className, int flags)245 public ActivityInfo getReceiverInfo(ComponentName className, int flags) 246 throws NameNotFoundException { 247 try { 248 ActivityInfo ai = mPM.getReceiverInfo(className, flags, mContext.getUserId()); 249 if (ai != null) { 250 return ai; 251 } 252 } catch (RemoteException e) { 253 throw new RuntimeException("Package manager has died", e); 254 } 255 256 throw new NameNotFoundException(className.toString()); 257 } 258 259 @Override getServiceInfo(ComponentName className, int flags)260 public ServiceInfo getServiceInfo(ComponentName className, int flags) 261 throws NameNotFoundException { 262 try { 263 ServiceInfo si = mPM.getServiceInfo(className, flags, mContext.getUserId()); 264 if (si != null) { 265 return si; 266 } 267 } catch (RemoteException e) { 268 throw new RuntimeException("Package manager has died", e); 269 } 270 271 throw new NameNotFoundException(className.toString()); 272 } 273 274 @Override getProviderInfo(ComponentName className, int flags)275 public ProviderInfo getProviderInfo(ComponentName className, int flags) 276 throws NameNotFoundException { 277 try { 278 ProviderInfo pi = mPM.getProviderInfo(className, flags, mContext.getUserId()); 279 if (pi != null) { 280 return pi; 281 } 282 } catch (RemoteException e) { 283 throw new RuntimeException("Package manager has died", e); 284 } 285 286 throw new NameNotFoundException(className.toString()); 287 } 288 289 @Override getSystemSharedLibraryNames()290 public String[] getSystemSharedLibraryNames() { 291 try { 292 return mPM.getSystemSharedLibraryNames(); 293 } catch (RemoteException e) { 294 throw new RuntimeException("Package manager has died", e); 295 } 296 } 297 298 @Override getSystemAvailableFeatures()299 public FeatureInfo[] getSystemAvailableFeatures() { 300 try { 301 return mPM.getSystemAvailableFeatures(); 302 } catch (RemoteException e) { 303 throw new RuntimeException("Package manager has died", e); 304 } 305 } 306 307 @Override hasSystemFeature(String name)308 public boolean hasSystemFeature(String name) { 309 try { 310 return mPM.hasSystemFeature(name); 311 } catch (RemoteException e) { 312 throw new RuntimeException("Package manager has died", e); 313 } 314 } 315 316 @Override checkPermission(String permName, String pkgName)317 public int checkPermission(String permName, String pkgName) { 318 try { 319 return mPM.checkPermission(permName, pkgName); 320 } catch (RemoteException e) { 321 throw new RuntimeException("Package manager has died", e); 322 } 323 } 324 325 @Override addPermission(PermissionInfo info)326 public boolean addPermission(PermissionInfo info) { 327 try { 328 return mPM.addPermission(info); 329 } catch (RemoteException e) { 330 throw new RuntimeException("Package manager has died", e); 331 } 332 } 333 334 @Override addPermissionAsync(PermissionInfo info)335 public boolean addPermissionAsync(PermissionInfo info) { 336 try { 337 return mPM.addPermissionAsync(info); 338 } catch (RemoteException e) { 339 throw new RuntimeException("Package manager has died", e); 340 } 341 } 342 343 @Override removePermission(String name)344 public void removePermission(String name) { 345 try { 346 mPM.removePermission(name); 347 } catch (RemoteException e) { 348 throw new RuntimeException("Package manager has died", e); 349 } 350 } 351 352 @Override grantPermission(String packageName, String permissionName)353 public void grantPermission(String packageName, String permissionName) { 354 try { 355 mPM.grantPermission(packageName, permissionName); 356 } catch (RemoteException e) { 357 throw new RuntimeException("Package manager has died", e); 358 } 359 } 360 361 @Override revokePermission(String packageName, String permissionName)362 public void revokePermission(String packageName, String permissionName) { 363 try { 364 mPM.revokePermission(packageName, permissionName); 365 } catch (RemoteException e) { 366 throw new RuntimeException("Package manager has died", e); 367 } 368 } 369 370 @Override checkSignatures(String pkg1, String pkg2)371 public int checkSignatures(String pkg1, String pkg2) { 372 try { 373 return mPM.checkSignatures(pkg1, pkg2); 374 } catch (RemoteException e) { 375 throw new RuntimeException("Package manager has died", e); 376 } 377 } 378 379 @Override checkSignatures(int uid1, int uid2)380 public int checkSignatures(int uid1, int uid2) { 381 try { 382 return mPM.checkUidSignatures(uid1, uid2); 383 } catch (RemoteException e) { 384 throw new RuntimeException("Package manager has died", e); 385 } 386 } 387 388 @Override getPackagesForUid(int uid)389 public String[] getPackagesForUid(int uid) { 390 try { 391 return mPM.getPackagesForUid(uid); 392 } catch (RemoteException e) { 393 throw new RuntimeException("Package manager has died", e); 394 } 395 } 396 397 @Override getNameForUid(int uid)398 public String getNameForUid(int uid) { 399 try { 400 return mPM.getNameForUid(uid); 401 } catch (RemoteException e) { 402 throw new RuntimeException("Package manager has died", e); 403 } 404 } 405 406 @Override getUidForSharedUser(String sharedUserName)407 public int getUidForSharedUser(String sharedUserName) 408 throws NameNotFoundException { 409 try { 410 int uid = mPM.getUidForSharedUser(sharedUserName); 411 if(uid != -1) { 412 return uid; 413 } 414 } catch (RemoteException e) { 415 throw new RuntimeException("Package manager has died", e); 416 } 417 throw new NameNotFoundException("No shared userid for user:"+sharedUserName); 418 } 419 420 @SuppressWarnings("unchecked") 421 @Override getInstalledPackages(int flags)422 public List<PackageInfo> getInstalledPackages(int flags) { 423 return getInstalledPackages(flags, mContext.getUserId()); 424 } 425 426 /** @hide */ 427 @Override getInstalledPackages(int flags, int userId)428 public List<PackageInfo> getInstalledPackages(int flags, int userId) { 429 try { 430 ParceledListSlice<PackageInfo> slice = mPM.getInstalledPackages(flags, userId); 431 return slice.getList(); 432 } catch (RemoteException e) { 433 throw new RuntimeException("Package manager has died", e); 434 } 435 } 436 437 @SuppressWarnings("unchecked") 438 @Override getPackagesHoldingPermissions( String[] permissions, int flags)439 public List<PackageInfo> getPackagesHoldingPermissions( 440 String[] permissions, int flags) { 441 final int userId = mContext.getUserId(); 442 try { 443 ParceledListSlice<PackageInfo> slice = mPM.getPackagesHoldingPermissions( 444 permissions, flags, userId); 445 return slice.getList(); 446 } catch (RemoteException e) { 447 throw new RuntimeException("Package manager has died", e); 448 } 449 } 450 451 @SuppressWarnings("unchecked") 452 @Override getInstalledApplications(int flags)453 public List<ApplicationInfo> getInstalledApplications(int flags) { 454 final int userId = mContext.getUserId(); 455 try { 456 ParceledListSlice<ApplicationInfo> slice = mPM.getInstalledApplications(flags, userId); 457 return slice.getList(); 458 } catch (RemoteException e) { 459 throw new RuntimeException("Package manager has died", e); 460 } 461 } 462 463 @Override resolveActivity(Intent intent, int flags)464 public ResolveInfo resolveActivity(Intent intent, int flags) { 465 return resolveActivityAsUser(intent, flags, mContext.getUserId()); 466 } 467 468 @Override resolveActivityAsUser(Intent intent, int flags, int userId)469 public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { 470 try { 471 return mPM.resolveIntent( 472 intent, 473 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 474 flags, 475 userId); 476 } catch (RemoteException e) { 477 throw new RuntimeException("Package manager has died", e); 478 } 479 } 480 481 @Override queryIntentActivities(Intent intent, int flags)482 public List<ResolveInfo> queryIntentActivities(Intent intent, 483 int flags) { 484 return queryIntentActivitiesAsUser(intent, flags, mContext.getUserId()); 485 } 486 487 /** @hide Same as above but for a specific user */ 488 @Override queryIntentActivitiesAsUser(Intent intent, int flags, int userId)489 public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, 490 int flags, int userId) { 491 try { 492 return mPM.queryIntentActivities( 493 intent, 494 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 495 flags, 496 userId); 497 } catch (RemoteException e) { 498 throw new RuntimeException("Package manager has died", e); 499 } 500 } 501 502 @Override queryIntentActivityOptions( ComponentName caller, Intent[] specifics, Intent intent, int flags)503 public List<ResolveInfo> queryIntentActivityOptions( 504 ComponentName caller, Intent[] specifics, Intent intent, 505 int flags) { 506 final ContentResolver resolver = mContext.getContentResolver(); 507 508 String[] specificTypes = null; 509 if (specifics != null) { 510 final int N = specifics.length; 511 for (int i=0; i<N; i++) { 512 Intent sp = specifics[i]; 513 if (sp != null) { 514 String t = sp.resolveTypeIfNeeded(resolver); 515 if (t != null) { 516 if (specificTypes == null) { 517 specificTypes = new String[N]; 518 } 519 specificTypes[i] = t; 520 } 521 } 522 } 523 } 524 525 try { 526 return mPM.queryIntentActivityOptions(caller, specifics, 527 specificTypes, intent, intent.resolveTypeIfNeeded(resolver), 528 flags, mContext.getUserId()); 529 } catch (RemoteException e) { 530 throw new RuntimeException("Package manager has died", e); 531 } 532 } 533 534 /** 535 * @hide 536 */ 537 @Override queryBroadcastReceivers(Intent intent, int flags, int userId)538 public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) { 539 try { 540 return mPM.queryIntentReceivers( 541 intent, 542 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 543 flags, 544 userId); 545 } catch (RemoteException e) { 546 throw new RuntimeException("Package manager has died", e); 547 } 548 } 549 550 @Override queryBroadcastReceivers(Intent intent, int flags)551 public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { 552 return queryBroadcastReceivers(intent, flags, mContext.getUserId()); 553 } 554 555 @Override resolveService(Intent intent, int flags)556 public ResolveInfo resolveService(Intent intent, int flags) { 557 try { 558 return mPM.resolveService( 559 intent, 560 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 561 flags, 562 mContext.getUserId()); 563 } catch (RemoteException e) { 564 throw new RuntimeException("Package manager has died", e); 565 } 566 } 567 568 @Override queryIntentServicesAsUser(Intent intent, int flags, int userId)569 public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) { 570 try { 571 return mPM.queryIntentServices( 572 intent, 573 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 574 flags, 575 userId); 576 } catch (RemoteException e) { 577 throw new RuntimeException("Package manager has died", e); 578 } 579 } 580 581 @Override queryIntentServices(Intent intent, int flags)582 public List<ResolveInfo> queryIntentServices(Intent intent, int flags) { 583 return queryIntentServicesAsUser(intent, flags, mContext.getUserId()); 584 } 585 586 @Override resolveContentProvider(String name, int flags)587 public ProviderInfo resolveContentProvider(String name, 588 int flags) { 589 try { 590 return mPM.resolveContentProvider(name, flags, mContext.getUserId()); 591 } catch (RemoteException e) { 592 throw new RuntimeException("Package manager has died", e); 593 } 594 } 595 596 @Override queryContentProviders(String processName, int uid, int flags)597 public List<ProviderInfo> queryContentProviders(String processName, 598 int uid, int flags) { 599 try { 600 return mPM.queryContentProviders(processName, uid, flags); 601 } catch (RemoteException e) { 602 throw new RuntimeException("Package manager has died", e); 603 } 604 } 605 606 @Override getInstrumentationInfo( ComponentName className, int flags)607 public InstrumentationInfo getInstrumentationInfo( 608 ComponentName className, int flags) 609 throws NameNotFoundException { 610 try { 611 InstrumentationInfo ii = mPM.getInstrumentationInfo( 612 className, flags); 613 if (ii != null) { 614 return ii; 615 } 616 } catch (RemoteException e) { 617 throw new RuntimeException("Package manager has died", e); 618 } 619 620 throw new NameNotFoundException(className.toString()); 621 } 622 623 @Override queryInstrumentation( String targetPackage, int flags)624 public List<InstrumentationInfo> queryInstrumentation( 625 String targetPackage, int flags) { 626 try { 627 return mPM.queryInstrumentation(targetPackage, flags); 628 } catch (RemoteException e) { 629 throw new RuntimeException("Package manager has died", e); 630 } 631 } 632 getDrawable(String packageName, int resid, ApplicationInfo appInfo)633 @Override public Drawable getDrawable(String packageName, int resid, 634 ApplicationInfo appInfo) { 635 ResourceName name = new ResourceName(packageName, resid); 636 Drawable dr = getCachedIcon(name); 637 if (dr != null) { 638 return dr; 639 } 640 if (appInfo == null) { 641 try { 642 appInfo = getApplicationInfo(packageName, 0); 643 } catch (NameNotFoundException e) { 644 return null; 645 } 646 } 647 try { 648 Resources r = getResourcesForApplication(appInfo); 649 dr = r.getDrawable(resid); 650 if (false) { 651 RuntimeException e = new RuntimeException("here"); 652 e.fillInStackTrace(); 653 Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid) 654 + " from package " + packageName 655 + ": app scale=" + r.getCompatibilityInfo().applicationScale 656 + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale, 657 e); 658 } 659 if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x" 660 + Integer.toHexString(resid) + " from " + r 661 + ": " + dr); 662 putCachedIcon(name, dr); 663 return dr; 664 } catch (NameNotFoundException e) { 665 Log.w("PackageManager", "Failure retrieving resources for" 666 + appInfo.packageName); 667 } catch (Resources.NotFoundException e) { 668 Log.w("PackageManager", "Failure retrieving resources for" 669 + appInfo.packageName + ": " + e.getMessage()); 670 } catch (RuntimeException e) { 671 // If an exception was thrown, fall through to return 672 // default icon. 673 Log.w("PackageManager", "Failure retrieving icon 0x" 674 + Integer.toHexString(resid) + " in package " 675 + packageName, e); 676 } 677 return null; 678 } 679 getActivityIcon(ComponentName activityName)680 @Override public Drawable getActivityIcon(ComponentName activityName) 681 throws NameNotFoundException { 682 return getActivityInfo(activityName, 0).loadIcon(this); 683 } 684 getActivityIcon(Intent intent)685 @Override public Drawable getActivityIcon(Intent intent) 686 throws NameNotFoundException { 687 if (intent.getComponent() != null) { 688 return getActivityIcon(intent.getComponent()); 689 } 690 691 ResolveInfo info = resolveActivity( 692 intent, PackageManager.MATCH_DEFAULT_ONLY); 693 if (info != null) { 694 return info.activityInfo.loadIcon(this); 695 } 696 697 throw new NameNotFoundException(intent.toUri(0)); 698 } 699 getDefaultActivityIcon()700 @Override public Drawable getDefaultActivityIcon() { 701 return Resources.getSystem().getDrawable( 702 com.android.internal.R.drawable.sym_def_app_icon); 703 } 704 getApplicationIcon(ApplicationInfo info)705 @Override public Drawable getApplicationIcon(ApplicationInfo info) { 706 return info.loadIcon(this); 707 } 708 getApplicationIcon(String packageName)709 @Override public Drawable getApplicationIcon(String packageName) 710 throws NameNotFoundException { 711 return getApplicationIcon(getApplicationInfo(packageName, 0)); 712 } 713 714 @Override getActivityLogo(ComponentName activityName)715 public Drawable getActivityLogo(ComponentName activityName) 716 throws NameNotFoundException { 717 return getActivityInfo(activityName, 0).loadLogo(this); 718 } 719 720 @Override getActivityLogo(Intent intent)721 public Drawable getActivityLogo(Intent intent) 722 throws NameNotFoundException { 723 if (intent.getComponent() != null) { 724 return getActivityLogo(intent.getComponent()); 725 } 726 727 ResolveInfo info = resolveActivity( 728 intent, PackageManager.MATCH_DEFAULT_ONLY); 729 if (info != null) { 730 return info.activityInfo.loadLogo(this); 731 } 732 733 throw new NameNotFoundException(intent.toUri(0)); 734 } 735 736 @Override getApplicationLogo(ApplicationInfo info)737 public Drawable getApplicationLogo(ApplicationInfo info) { 738 return info.loadLogo(this); 739 } 740 741 @Override getApplicationLogo(String packageName)742 public Drawable getApplicationLogo(String packageName) 743 throws NameNotFoundException { 744 return getApplicationLogo(getApplicationInfo(packageName, 0)); 745 } 746 getResourcesForActivity( ComponentName activityName)747 @Override public Resources getResourcesForActivity( 748 ComponentName activityName) throws NameNotFoundException { 749 return getResourcesForApplication( 750 getActivityInfo(activityName, 0).applicationInfo); 751 } 752 getResourcesForApplication( ApplicationInfo app)753 @Override public Resources getResourcesForApplication( 754 ApplicationInfo app) throws NameNotFoundException { 755 if (app.packageName.equals("system")) { 756 return mContext.mMainThread.getSystemContext().getResources(); 757 } 758 Resources r = mContext.mMainThread.getTopLevelResources( 759 app.uid == Process.myUid() ? app.sourceDir : app.publicSourceDir, 760 Display.DEFAULT_DISPLAY, null, mContext.mPackageInfo); 761 if (r != null) { 762 return r; 763 } 764 throw new NameNotFoundException("Unable to open " + app.publicSourceDir); 765 } 766 getResourcesForApplication( String appPackageName)767 @Override public Resources getResourcesForApplication( 768 String appPackageName) throws NameNotFoundException { 769 return getResourcesForApplication( 770 getApplicationInfo(appPackageName, 0)); 771 } 772 773 /** @hide */ 774 @Override getResourcesForApplicationAsUser(String appPackageName, int userId)775 public Resources getResourcesForApplicationAsUser(String appPackageName, int userId) 776 throws NameNotFoundException { 777 if (userId < 0) { 778 throw new IllegalArgumentException( 779 "Call does not support special user #" + userId); 780 } 781 if ("system".equals(appPackageName)) { 782 return mContext.mMainThread.getSystemContext().getResources(); 783 } 784 try { 785 ApplicationInfo ai = mPM.getApplicationInfo(appPackageName, 0, userId); 786 if (ai != null) { 787 return getResourcesForApplication(ai); 788 } 789 } catch (RemoteException e) { 790 throw new RuntimeException("Package manager has died", e); 791 } 792 throw new NameNotFoundException("Package " + appPackageName + " doesn't exist"); 793 } 794 795 int mCachedSafeMode = -1; isSafeMode()796 @Override public boolean isSafeMode() { 797 try { 798 if (mCachedSafeMode < 0) { 799 mCachedSafeMode = mPM.isSafeMode() ? 1 : 0; 800 } 801 return mCachedSafeMode != 0; 802 } catch (RemoteException e) { 803 throw new RuntimeException("Package manager has died", e); 804 } 805 } 806 configurationChanged()807 static void configurationChanged() { 808 synchronized (sSync) { 809 sIconCache.clear(); 810 sStringCache.clear(); 811 } 812 } 813 ApplicationPackageManager(ContextImpl context, IPackageManager pm)814 ApplicationPackageManager(ContextImpl context, 815 IPackageManager pm) { 816 mContext = context; 817 mPM = pm; 818 } 819 getCachedIcon(ResourceName name)820 private Drawable getCachedIcon(ResourceName name) { 821 synchronized (sSync) { 822 WeakReference<Drawable.ConstantState> wr = sIconCache.get(name); 823 if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for " 824 + name + ": " + wr); 825 if (wr != null) { // we have the activity 826 Drawable.ConstantState state = wr.get(); 827 if (state != null) { 828 if (DEBUG_ICONS) { 829 Log.v(TAG, "Get cached drawable state for " + name + ": " + state); 830 } 831 // Note: It's okay here to not use the newDrawable(Resources) variant 832 // of the API. The ConstantState comes from a drawable that was 833 // originally created by passing the proper app Resources instance 834 // which means the state should already contain the proper 835 // resources specific information (like density.) See 836 // BitmapDrawable.BitmapState for instance. 837 return state.newDrawable(); 838 } 839 // our entry has been purged 840 sIconCache.remove(name); 841 } 842 } 843 return null; 844 } 845 putCachedIcon(ResourceName name, Drawable dr)846 private void putCachedIcon(ResourceName name, Drawable dr) { 847 synchronized (sSync) { 848 sIconCache.put(name, new WeakReference<Drawable.ConstantState>(dr.getConstantState())); 849 if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable state for " + name + ": " + dr); 850 } 851 } 852 handlePackageBroadcast(int cmd, String[] pkgList, boolean hasPkgInfo)853 static void handlePackageBroadcast(int cmd, String[] pkgList, boolean hasPkgInfo) { 854 boolean immediateGc = false; 855 if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) { 856 immediateGc = true; 857 } 858 if (pkgList != null && (pkgList.length > 0)) { 859 boolean needCleanup = false; 860 for (String ssp : pkgList) { 861 synchronized (sSync) { 862 if (sIconCache.size() > 0) { 863 Iterator<ResourceName> it = sIconCache.keySet().iterator(); 864 while (it.hasNext()) { 865 ResourceName nm = it.next(); 866 if (nm.packageName.equals(ssp)) { 867 //Log.i(TAG, "Removing cached drawable for " + nm); 868 it.remove(); 869 needCleanup = true; 870 } 871 } 872 } 873 if (sStringCache.size() > 0) { 874 Iterator<ResourceName> it = sStringCache.keySet().iterator(); 875 while (it.hasNext()) { 876 ResourceName nm = it.next(); 877 if (nm.packageName.equals(ssp)) { 878 //Log.i(TAG, "Removing cached string for " + nm); 879 it.remove(); 880 needCleanup = true; 881 } 882 } 883 } 884 } 885 } 886 if (needCleanup || hasPkgInfo) { 887 if (immediateGc) { 888 // Schedule an immediate gc. 889 Runtime.getRuntime().gc(); 890 } else { 891 ActivityThread.currentActivityThread().scheduleGcIdler(); 892 } 893 } 894 } 895 } 896 897 private static final class ResourceName { 898 final String packageName; 899 final int iconId; 900 ResourceName(String _packageName, int _iconId)901 ResourceName(String _packageName, int _iconId) { 902 packageName = _packageName; 903 iconId = _iconId; 904 } 905 ResourceName(ApplicationInfo aInfo, int _iconId)906 ResourceName(ApplicationInfo aInfo, int _iconId) { 907 this(aInfo.packageName, _iconId); 908 } 909 ResourceName(ComponentInfo cInfo, int _iconId)910 ResourceName(ComponentInfo cInfo, int _iconId) { 911 this(cInfo.applicationInfo.packageName, _iconId); 912 } 913 ResourceName(ResolveInfo rInfo, int _iconId)914 ResourceName(ResolveInfo rInfo, int _iconId) { 915 this(rInfo.activityInfo.applicationInfo.packageName, _iconId); 916 } 917 918 @Override equals(Object o)919 public boolean equals(Object o) { 920 if (this == o) return true; 921 if (o == null || getClass() != o.getClass()) return false; 922 923 ResourceName that = (ResourceName) o; 924 925 if (iconId != that.iconId) return false; 926 return !(packageName != null ? 927 !packageName.equals(that.packageName) : that.packageName != null); 928 929 } 930 931 @Override hashCode()932 public int hashCode() { 933 int result; 934 result = packageName.hashCode(); 935 result = 31 * result + iconId; 936 return result; 937 } 938 939 @Override toString()940 public String toString() { 941 return "{ResourceName " + packageName + " / " + iconId + "}"; 942 } 943 } 944 getCachedString(ResourceName name)945 private CharSequence getCachedString(ResourceName name) { 946 synchronized (sSync) { 947 WeakReference<CharSequence> wr = sStringCache.get(name); 948 if (wr != null) { // we have the activity 949 CharSequence cs = wr.get(); 950 if (cs != null) { 951 return cs; 952 } 953 // our entry has been purged 954 sStringCache.remove(name); 955 } 956 } 957 return null; 958 } 959 putCachedString(ResourceName name, CharSequence cs)960 private void putCachedString(ResourceName name, CharSequence cs) { 961 synchronized (sSync) { 962 sStringCache.put(name, new WeakReference<CharSequence>(cs)); 963 } 964 } 965 966 @Override getText(String packageName, int resid, ApplicationInfo appInfo)967 public CharSequence getText(String packageName, int resid, 968 ApplicationInfo appInfo) { 969 ResourceName name = new ResourceName(packageName, resid); 970 CharSequence text = getCachedString(name); 971 if (text != null) { 972 return text; 973 } 974 if (appInfo == null) { 975 try { 976 appInfo = getApplicationInfo(packageName, 0); 977 } catch (NameNotFoundException e) { 978 return null; 979 } 980 } 981 try { 982 Resources r = getResourcesForApplication(appInfo); 983 text = r.getText(resid); 984 putCachedString(name, text); 985 return text; 986 } catch (NameNotFoundException e) { 987 Log.w("PackageManager", "Failure retrieving resources for" 988 + appInfo.packageName); 989 } catch (RuntimeException e) { 990 // If an exception was thrown, fall through to return 991 // default icon. 992 Log.w("PackageManager", "Failure retrieving text 0x" 993 + Integer.toHexString(resid) + " in package " 994 + packageName, e); 995 } 996 return null; 997 } 998 999 @Override getXml(String packageName, int resid, ApplicationInfo appInfo)1000 public XmlResourceParser getXml(String packageName, int resid, 1001 ApplicationInfo appInfo) { 1002 if (appInfo == null) { 1003 try { 1004 appInfo = getApplicationInfo(packageName, 0); 1005 } catch (NameNotFoundException e) { 1006 return null; 1007 } 1008 } 1009 try { 1010 Resources r = getResourcesForApplication(appInfo); 1011 return r.getXml(resid); 1012 } catch (RuntimeException e) { 1013 // If an exception was thrown, fall through to return 1014 // default icon. 1015 Log.w("PackageManager", "Failure retrieving xml 0x" 1016 + Integer.toHexString(resid) + " in package " 1017 + packageName, e); 1018 } catch (NameNotFoundException e) { 1019 Log.w("PackageManager", "Failure retrieving resources for " 1020 + appInfo.packageName); 1021 } 1022 return null; 1023 } 1024 1025 @Override getApplicationLabel(ApplicationInfo info)1026 public CharSequence getApplicationLabel(ApplicationInfo info) { 1027 return info.loadLabel(this); 1028 } 1029 1030 @Override installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)1031 public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, 1032 String installerPackageName) { 1033 try { 1034 mPM.installPackage(packageURI, observer, flags, installerPackageName); 1035 } catch (RemoteException e) { 1036 // Should never happen! 1037 } 1038 } 1039 1040 @Override installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams)1041 public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, 1042 int flags, String installerPackageName, Uri verificationURI, 1043 ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) { 1044 try { 1045 mPM.installPackageWithVerification(packageURI, observer, flags, installerPackageName, 1046 verificationURI, manifestDigest, encryptionParams); 1047 } catch (RemoteException e) { 1048 // Should never happen! 1049 } 1050 } 1051 1052 @Override installPackageWithVerificationAndEncryption(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, VerificationParams verificationParams, ContainerEncryptionParams encryptionParams)1053 public void installPackageWithVerificationAndEncryption(Uri packageURI, 1054 IPackageInstallObserver observer, int flags, String installerPackageName, 1055 VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { 1056 try { 1057 mPM.installPackageWithVerificationAndEncryption(packageURI, observer, flags, 1058 installerPackageName, verificationParams, encryptionParams); 1059 } catch (RemoteException e) { 1060 // Should never happen! 1061 } 1062 } 1063 1064 @Override installExistingPackage(String packageName)1065 public int installExistingPackage(String packageName) 1066 throws NameNotFoundException { 1067 try { 1068 int res = mPM.installExistingPackageAsUser(packageName, UserHandle.myUserId()); 1069 if (res == INSTALL_FAILED_INVALID_URI) { 1070 throw new NameNotFoundException("Package " + packageName + " doesn't exist"); 1071 } 1072 return res; 1073 } catch (RemoteException e) { 1074 // Should never happen! 1075 throw new NameNotFoundException("Package " + packageName + " doesn't exist"); 1076 } 1077 } 1078 1079 @Override verifyPendingInstall(int id, int response)1080 public void verifyPendingInstall(int id, int response) { 1081 try { 1082 mPM.verifyPendingInstall(id, response); 1083 } catch (RemoteException e) { 1084 // Should never happen! 1085 } 1086 } 1087 1088 @Override extendVerificationTimeout(int id, int verificationCodeAtTimeout, long millisecondsToDelay)1089 public void extendVerificationTimeout(int id, int verificationCodeAtTimeout, 1090 long millisecondsToDelay) { 1091 try { 1092 mPM.extendVerificationTimeout(id, verificationCodeAtTimeout, millisecondsToDelay); 1093 } catch (RemoteException e) { 1094 // Should never happen! 1095 } 1096 } 1097 1098 @Override setInstallerPackageName(String targetPackage, String installerPackageName)1099 public void setInstallerPackageName(String targetPackage, 1100 String installerPackageName) { 1101 try { 1102 mPM.setInstallerPackageName(targetPackage, installerPackageName); 1103 } catch (RemoteException e) { 1104 // Should never happen! 1105 } 1106 } 1107 1108 @Override movePackage(String packageName, IPackageMoveObserver observer, int flags)1109 public void movePackage(String packageName, IPackageMoveObserver observer, int flags) { 1110 try { 1111 mPM.movePackage(packageName, observer, flags); 1112 } catch (RemoteException e) { 1113 // Should never happen! 1114 } 1115 } 1116 1117 @Override getInstallerPackageName(String packageName)1118 public String getInstallerPackageName(String packageName) { 1119 try { 1120 return mPM.getInstallerPackageName(packageName); 1121 } catch (RemoteException e) { 1122 // Should never happen! 1123 } 1124 return null; 1125 } 1126 1127 @Override deletePackage(String packageName, IPackageDeleteObserver observer, int flags)1128 public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) { 1129 try { 1130 mPM.deletePackageAsUser(packageName, observer, UserHandle.myUserId(), flags); 1131 } catch (RemoteException e) { 1132 // Should never happen! 1133 } 1134 } 1135 @Override clearApplicationUserData(String packageName, IPackageDataObserver observer)1136 public void clearApplicationUserData(String packageName, 1137 IPackageDataObserver observer) { 1138 try { 1139 mPM.clearApplicationUserData(packageName, observer, mContext.getUserId()); 1140 } catch (RemoteException e) { 1141 // Should never happen! 1142 } 1143 } 1144 @Override deleteApplicationCacheFiles(String packageName, IPackageDataObserver observer)1145 public void deleteApplicationCacheFiles(String packageName, 1146 IPackageDataObserver observer) { 1147 try { 1148 mPM.deleteApplicationCacheFiles(packageName, observer); 1149 } catch (RemoteException e) { 1150 // Should never happen! 1151 } 1152 } 1153 @Override freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer)1154 public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) { 1155 try { 1156 mPM.freeStorageAndNotify(idealStorageSize, observer); 1157 } catch (RemoteException e) { 1158 // Should never happen! 1159 } 1160 } 1161 1162 @Override freeStorage(long freeStorageSize, IntentSender pi)1163 public void freeStorage(long freeStorageSize, IntentSender pi) { 1164 try { 1165 mPM.freeStorage(freeStorageSize, pi); 1166 } catch (RemoteException e) { 1167 // Should never happen! 1168 } 1169 } 1170 1171 @Override getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer)1172 public void getPackageSizeInfo(String packageName, int userHandle, 1173 IPackageStatsObserver observer) { 1174 try { 1175 mPM.getPackageSizeInfo(packageName, userHandle, observer); 1176 } catch (RemoteException e) { 1177 // Should never happen! 1178 } 1179 } 1180 @Override addPackageToPreferred(String packageName)1181 public void addPackageToPreferred(String packageName) { 1182 try { 1183 mPM.addPackageToPreferred(packageName); 1184 } catch (RemoteException e) { 1185 // Should never happen! 1186 } 1187 } 1188 1189 @Override removePackageFromPreferred(String packageName)1190 public void removePackageFromPreferred(String packageName) { 1191 try { 1192 mPM.removePackageFromPreferred(packageName); 1193 } catch (RemoteException e) { 1194 // Should never happen! 1195 } 1196 } 1197 1198 @Override getPreferredPackages(int flags)1199 public List<PackageInfo> getPreferredPackages(int flags) { 1200 try { 1201 return mPM.getPreferredPackages(flags); 1202 } catch (RemoteException e) { 1203 // Should never happen! 1204 } 1205 return new ArrayList<PackageInfo>(); 1206 } 1207 1208 @Override addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity)1209 public void addPreferredActivity(IntentFilter filter, 1210 int match, ComponentName[] set, ComponentName activity) { 1211 try { 1212 mPM.addPreferredActivity(filter, match, set, activity, mContext.getUserId()); 1213 } catch (RemoteException e) { 1214 // Should never happen! 1215 } 1216 } 1217 1218 @Override addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, int userId)1219 public void addPreferredActivity(IntentFilter filter, int match, 1220 ComponentName[] set, ComponentName activity, int userId) { 1221 try { 1222 mPM.addPreferredActivity(filter, match, set, activity, userId); 1223 } catch (RemoteException e) { 1224 // Should never happen! 1225 } 1226 } 1227 1228 @Override replacePreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity)1229 public void replacePreferredActivity(IntentFilter filter, 1230 int match, ComponentName[] set, ComponentName activity) { 1231 try { 1232 mPM.replacePreferredActivity(filter, match, set, activity); 1233 } catch (RemoteException e) { 1234 // Should never happen! 1235 } 1236 } 1237 1238 @Override clearPackagePreferredActivities(String packageName)1239 public void clearPackagePreferredActivities(String packageName) { 1240 try { 1241 mPM.clearPackagePreferredActivities(packageName); 1242 } catch (RemoteException e) { 1243 // Should never happen! 1244 } 1245 } 1246 1247 @Override getPreferredActivities(List<IntentFilter> outFilters, List<ComponentName> outActivities, String packageName)1248 public int getPreferredActivities(List<IntentFilter> outFilters, 1249 List<ComponentName> outActivities, String packageName) { 1250 try { 1251 return mPM.getPreferredActivities(outFilters, outActivities, packageName); 1252 } catch (RemoteException e) { 1253 // Should never happen! 1254 } 1255 return 0; 1256 } 1257 1258 @Override setComponentEnabledSetting(ComponentName componentName, int newState, int flags)1259 public void setComponentEnabledSetting(ComponentName componentName, 1260 int newState, int flags) { 1261 try { 1262 mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId()); 1263 } catch (RemoteException e) { 1264 // Should never happen! 1265 } 1266 } 1267 1268 @Override getComponentEnabledSetting(ComponentName componentName)1269 public int getComponentEnabledSetting(ComponentName componentName) { 1270 try { 1271 return mPM.getComponentEnabledSetting(componentName, mContext.getUserId()); 1272 } catch (RemoteException e) { 1273 // Should never happen! 1274 } 1275 return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 1276 } 1277 1278 @Override setApplicationEnabledSetting(String packageName, int newState, int flags)1279 public void setApplicationEnabledSetting(String packageName, 1280 int newState, int flags) { 1281 try { 1282 mPM.setApplicationEnabledSetting(packageName, newState, flags, 1283 mContext.getUserId(), mContext.getBasePackageName()); 1284 } catch (RemoteException e) { 1285 // Should never happen! 1286 } 1287 } 1288 1289 @Override getApplicationEnabledSetting(String packageName)1290 public int getApplicationEnabledSetting(String packageName) { 1291 try { 1292 return mPM.getApplicationEnabledSetting(packageName, mContext.getUserId()); 1293 } catch (RemoteException e) { 1294 // Should never happen! 1295 } 1296 return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 1297 } 1298 1299 /** 1300 * @hide 1301 */ 1302 @Override getVerifierDeviceIdentity()1303 public VerifierDeviceIdentity getVerifierDeviceIdentity() { 1304 try { 1305 return mPM.getVerifierDeviceIdentity(); 1306 } catch (RemoteException e) { 1307 // Should never happen! 1308 } 1309 return null; 1310 } 1311 1312 private final ContextImpl mContext; 1313 private final IPackageManager mPM; 1314 1315 private static final Object sSync = new Object(); 1316 private static HashMap<ResourceName, WeakReference<Drawable.ConstantState>> sIconCache 1317 = new HashMap<ResourceName, WeakReference<Drawable.ConstantState>>(); 1318 private static HashMap<ResourceName, WeakReference<CharSequence>> sStringCache 1319 = new HashMap<ResourceName, WeakReference<CharSequence>>(); 1320 } 1321