Beispiel #1
0
  /**
   * Gets an entry for the package, which can be used as a fallback entry for various components.
   * This method is not thread safe, it must be called from a synchronized method.
   */
  private CacheEntry getEntryForPackageLocked(
      String packageName, UserHandleCompat user, boolean useLowResIcon) {
    ComponentKey cacheKey = getPackageKey(packageName, user);
    CacheEntry entry = mCache.get(cacheKey);

    if (entry == null || (entry.isLowResIcon && !useLowResIcon)) {
      entry = new CacheEntry();
      boolean entryUpdated = true;

      // Check the DB first.
      if (!getEntryFromDB(cacheKey, entry, useLowResIcon)) {
        try {
          int flags =
              UserHandleCompat.myUserHandle().equals(user)
                  ? 0
                  : PackageManager.GET_UNINSTALLED_PACKAGES;
          PackageInfo info = mPackageManager.getPackageInfo(packageName, flags);
          ApplicationInfo appInfo = info.applicationInfo;
          if (appInfo == null) {
            throw new NameNotFoundException("ApplicationInfo is null");
          }
          Drawable drawable =
              mUserManager.getBadgedDrawableForUser(appInfo.loadIcon(mPackageManager), user);
          entry.icon = Utilities.createIconBitmap(drawable, mContext);
          entry.title = appInfo.loadLabel(mPackageManager);
          entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user);
          entry.isLowResIcon = false;

          // Add the icon in the DB here, since these do not get written during
          // package updates.
          ContentValues values =
              newContentValues(entry.icon, entry.title.toString(), mPackageBgColor);
          addIconToDB(
              values, cacheKey.componentName, info, mUserManager.getSerialNumberForUser(user));

        } catch (NameNotFoundException e) {
          if (DEBUG) Log.d(TAG, "Application not installed " + packageName);
          entryUpdated = false;
        }
      }

      // Only add a filled-out entry to the cache
      if (entryUpdated) {
        mCache.put(cacheKey, entry);
      }
    }
    return entry;
  }
Beispiel #2
0
  public void updateDbIcons(Set<String> ignorePackagesForMainUser) {
    // Remove all active icon update tasks.
    mWorkerHandler.removeCallbacksAndMessages(ICON_UPDATE_TOKEN);

    updateSystemStateString();
    for (UserHandleCompat user : mUserManager.getUserProfiles()) {
      // Query for the set of apps
      final List<LauncherActivityInfoCompat> apps = mLauncherApps.getActivityList(null, user);
      // Fail if we don't have any apps
      // TODO: Fix this. Only fail for the current user.
      if (apps == null || apps.isEmpty()) {
        return;
      }

      // Update icon cache. This happens in segments and {@link #onPackageIconsUpdated}
      // is called by the icon cache when the job is complete.
      updateDBIcons(
          user,
          apps,
          UserHandleCompat.myUserHandle().equals(user)
              ? ignorePackagesForMainUser
              : Collections.<String>emptySet());
    }
  }