All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.path.android.jobqueue.nonPersistentQueue.NetworkAwarePriorityQueue Maven / Gradle / Ivy

package com.path.android.jobqueue.nonPersistentQueue;

import com.path.android.jobqueue.JobHolder;

import java.util.Collection;
import java.util.Comparator;
import java.util.Queue;

/**
 * A {@link MergedQueue} class that can separate jobs based on their network requirement
 */
public class NetworkAwarePriorityQueue extends MergedQueue {

    /**
     * create a network aware priority queue with given initial capacity * 2 and comparator
     * @param initialCapacity
     * @param comparator
     */
    public NetworkAwarePriorityQueue(int initialCapacity, Comparator comparator) {
        super(initialCapacity, comparator, new TimeAwareComparator(comparator));
    }

    /**
     * {@link java.util.Queue#peek()} implementation with network requirement filter
     * @param canUseNetwork if {@code true}, does not check network requirement if {@code false}, returns only from
     *                      no network queue
     * @return
     */
    public JobHolder peek(boolean canUseNetwork, Collection excludeGroupIds) {
        if(canUseNetwork) {
            return super.peek(excludeGroupIds);
        } else {
            return super.peekFromQueue(SetId.S1, excludeGroupIds);
        }
    }

    /**
     * {@link java.util.Queue#poll()} implementation with network requirement filter
     * @param canUseNetwork if {@code true}, does not check network requirement if {@code false}, returns only from
     *                      no network queue
     * @return
     */
    public JobHolder poll(boolean canUseNetwork, Collection excludeGroupIds) {
        if(canUseNetwork) {
            return super.peek(excludeGroupIds);
        } else {
            return super.peekFromQueue(SetId.S1, excludeGroupIds);
        }
    }

    @Override
    protected SetId decideQueue(JobHolder jobHolder) {
        return jobHolder.requiresNetwork() ? SetId.S0 : SetId.S1;
    }

    /**
     * create a {@link TimeAwarePriorityQueue}
     * @param ignoredQueueId
     * @param initialCapacity
     * @param comparator
     * @return
     */
    @Override
    protected JobSet createQueue(SetId ignoredQueueId, int initialCapacity, Comparator comparator) {
        return new TimeAwarePriorityQueue(initialCapacity, comparator);
    }


    public CountWithGroupIdsResult countReadyJobs(boolean hasNetwork, Collection excludeGroups) {
        long now = System.nanoTime();
        if(hasNetwork) {
            return super.countReadyJobs(SetId.S0, now, excludeGroups).mergeWith(super.countReadyJobs(SetId.S1, now, excludeGroups));
        } else {
            return super.countReadyJobs(SetId.S1, now, excludeGroups);
        }
    }

    @Override
    public CountWithGroupIdsResult countReadyJobs(long now, Collection excludeGroups) {
        throw new UnsupportedOperationException("cannot call network aware priority queue count w/o providing network status");
    }

    @Override
    public CountWithGroupIdsResult countReadyJobs(Collection excludeGroups) {
        throw new UnsupportedOperationException("cannot call network aware priority queue count w/o providing network status");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy