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();
    }
  }