private void pushSessionBadgeToLauncher(int sessionId) {
   SessionInfo session = mInstaller.getSessionInfo(sessionId);
   if (session != null) {
     addSessionInfoToCahce(session, UserHandleCompat.myUserHandle());
     if (session.getAppPackageName() != null) {
       mPendingBadgeUpdates.add(session.getAppPackageName());
     }
     mPendingReplays.put(sessionId, session);
     replayUpdates(null);
   }
 }
 @Override
 public HashSet<String> updateAndGetActiveSessionCache() {
   HashSet<String> activePackages = new HashSet<String>();
   UserHandleCompat user = UserHandleCompat.myUserHandle();
   for (SessionInfo info : mInstaller.getAllSessions()) {
     addSessionInfoToCahce(info, user);
     if (info.getAppPackageName() != null) {
       activePackages.add(info.getAppPackageName());
     }
   }
   return activePackages;
 }
 @Override
 public void onFinished(int sessionId, boolean success) {
   mPendingReplays.remove(sessionId);
   SessionInfo session = mInstaller.getSessionInfo(sessionId);
   if ((session != null) && (session.getAppPackageName() != null)) {
     mPendingBadgeUpdates.remove(session.getAppPackageName());
     // Replay all updates with a one time update for this installed package. No
     // need to store this record for future updates, as the app list will get
     // refreshed on resume.
     replayUpdates(
         new PackageInstallInfo(
             session.getAppPackageName(), success ? STATUS_INSTALLED : STATUS_FAILED, 0));
   }
 }
  private void replayUpdates(PackageInstallInfo newInfo) {
    if (DEBUG) Log.d(TAG, "updates resumed");
    if (!mResumed || !mBound) {
      // Not yet ready
      return;
    }
    if ((mPendingReplays.size() == 0) && (newInfo == null)) {
      // Nothing to update
      return;
    }

    LauncherAppState app = LauncherAppState.getInstanceNoCreate();
    if (app == null) {
      // Try again later
      if (DEBUG) Log.d(TAG, "app is null, delaying send");
      return;
    }

    ArrayList<PackageInstallInfo> updates = new ArrayList<PackageInstallInfo>();
    if ((newInfo != null) && (newInfo.state != STATUS_INSTALLED)) {
      updates.add(newInfo);
    }
    for (int i = mPendingReplays.size() - 1; i >= 0; i--) {
      SessionInfo session = mPendingReplays.valueAt(i);
      if (session.getAppPackageName() != null) {
        updates.add(
            new PackageInstallInfo(
                session.getAppPackageName(),
                STATUS_INSTALLING,
                (int) (session.getProgress() * 100)));
      }
    }
    mPendingReplays.clear();
    if (!updates.isEmpty()) {
      app.setPackageState(updates);
    }

    if (!mPendingBadgeUpdates.isEmpty()) {
      for (String pkg : mPendingBadgeUpdates) {
        app.updatePackageBadge(pkg);
      }
      mPendingBadgeUpdates.clear();
    }
  }
 private void addSessionInfoToCahce(SessionInfo info, UserHandleCompat user) {
   String packageName = info.getAppPackageName();
   if (packageName != null) {
     mCache.cachePackageInstallInfo(packageName, user, info.getAppIcon(), info.getAppLabel());
   }
 }