private synchronized ArrayList<SchedullerPackage> actualPackages(int contextId) {
    ArrayList<SchedullerPackage> foundedPackages = new ArrayList<SchedullerPackage>();
    long time = getCurrentTime();
    for (SchedullerPackage schedullerPackage :
        messages.values().toArray(new SchedullerPackage[0])) {
      if (schedullerPackage.queuedToChannel != -1
          && contextId != schedullerPackage.queuedToChannel) {
        continue;
      }
      boolean isPendingPackage = false;

      if (schedullerPackage.ttlTime <= getCurrentTime()) {
        forgetMessage(schedullerPackage.id);
        continue;
      }

      if (schedullerPackage.state == STATE_QUEUED) {
        if (schedullerPackage.scheduleTime <= time) {
          isPendingPackage = true;
        }
      } else if (schedullerPackage.state == STATE_SENT) {
        if (getCurrentTime() <= schedullerPackage.expiresTime) {
          if (schedullerPackage.serialized == null
              || schedullerPackage.serialized.length < BIG_MESSAGE_SIZE) {
            if (getCurrentTime() - schedullerPackage.lastAttemptTime >= RETRY_TIMEOUT) {
              isPendingPackage = true;
            }
          }
        }
      }

      if (isPendingPackage) {
        if (schedullerPackage.serialized == null) {
          try {
            if (schedullerPackage.isRpc) {
              schedullerPackage.serialized =
                  wrapper.wrapObject((TLMethod) schedullerPackage.object).serialize();
            } else {
              schedullerPackage.serialized = schedullerPackage.object.serialize();
            }
          } catch (IOException e) {
            Logger.e(TAG, e);
            forgetMessage(schedullerPackage.id);
            continue;
          }
        }

        foundedPackages.add(schedullerPackage);
      }
    }
    return foundedPackages;
  }