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