Request.java revision 3713094c56d25e25df2a508dbee4aea869ffdea1
13713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick/* 23713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Copyright (C) 2011 The Android Open Source Project 33713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 43713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 53713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * you may not use this file except in compliance with the License. 63713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * You may obtain a copy of the License at 73713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 83713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * http://www.apache.org/licenses/LICENSE-2.0 93713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Unless required by applicable law or agreed to in writing, software 113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * distributed under the License is distributed on an "AS IS" BASIS, 123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * See the License for the specific language governing permissions and 143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * limitations under the License. 153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickpackage com.android.volley; 183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport com.android.volley.VolleyLog.MarkerLog; 203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.os.Handler; 223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.os.Looper; 233713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.io.UnsupportedEncodingException; 253713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.net.URLEncoder; 263713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.util.Collections; 273713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.util.Map; 283713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick/** 303713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Base class for all network requests. 313713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 323713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @param <T> The type of parsed response this request expects. 333713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 343713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickpublic abstract class Request<T> implements Comparable<Request<T>> { 353713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 363713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Default encoding for POST parameters. See {@link #getPostParamsEncoding()}. */ 373713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private static final String DEFAULT_POST_PARAMS_ENCODING = "UTF-8"; 383713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 393713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** An event log tracing the lifetime of this request; for debugging. */ 403713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private final MarkerLog mEventLog = MarkerLog.ENABLED ? new MarkerLog() : null; 413713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 423713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** URL of this request. */ 433713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private final String mUrl; 443713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 453713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Listener interface for errors. */ 463713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private final Response.ErrorListener mErrorListener; 473713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 483713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Sequence number of this request, used to enforce FIFO ordering. */ 493713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private Integer mSequence; 503713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 513713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** The request queue this request is associated with. */ 523713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private RequestQueue mRequestQueue; 533713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 543713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Whether or not responses to this request should be cached. */ 553713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private boolean mShouldCache = true; 563713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 573713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Whether or not this request has been canceled. */ 583713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private boolean mCanceled = false; 593713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 603713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Whether or not this request should be suppressed by {@link RequestQueue#drain()}. */ 613713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private boolean mDrainable = true; 623713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 633713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Whether or not a response has been delivered for this request yet. */ 643713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private boolean mResponseDelivered = false; 653713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 663713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // A cheap variant of request tracing used to dump slow requests. 673713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private long mRequestBirthTime = 0; 683713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 693713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** Threshold at which we should log the request (even when debug logging is not enabled). */ 703713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private static final long SLOW_REQUEST_THRESHOLD_MS = 3000; 713713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 723713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** The retry policy for this request. */ 733713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private RetryPolicy mRetryPolicy; 743713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 753713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 763713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * When a request can be retrieved from cache but must be refreshed from 773713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * the network, the cache entry will be stored here so that in the event of 783713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * a "Not Modified" response, we can be sure it hasn't been evicted from cache. 793713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 803713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private Cache.Entry mCacheEntry = null; 813713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 823713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 833713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Creates a new request with the given URL and error listener. Note that 843713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * the normal response listener is not provided here as delivery of responses 853713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * is provided by subclasses, who have a better idea of how to deliver an 863713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * already-parsed response. 873713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 883713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public Request(String url, Response.ErrorListener listener) { 893713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mUrl = url; 903713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mErrorListener = listener; 913713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick setRetryPolicy(new DefaultRetryPolicy()); 923713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 933713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 943713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 953713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Sets the retry policy for this request. 963713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 973713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void setRetryPolicy(RetryPolicy retryPolicy) { 983713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mRetryPolicy = retryPolicy; 993713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1003713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1013713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1023713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Adds an event to this request's event log; for debugging. 1033713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1043713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void addMarker(String tag) { 1053713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (MarkerLog.ENABLED) { 1063713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mEventLog.add(tag, Thread.currentThread().getId()); 1073713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } else if (mRequestBirthTime == 0) { 1083713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mRequestBirthTime = System.currentTimeMillis(); 1093713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Notifies the request queue that this request has finished (successfully or with error). 1143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 1153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <p>Also dumps all events from this request's event log; for debugging.</p> 1163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick void finish(final String tag) { 1183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (mRequestQueue != null) { 1193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mRequestQueue.finish(this); 1203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (MarkerLog.ENABLED) { 1223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick final long threadId = Thread.currentThread().getId(); 1233713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (Looper.myLooper() != Looper.getMainLooper()) { 1243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // If we finish marking off of the main thread, we need to 1253713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // actually do it on the main thread to ensure correct ordering. 1263713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Handler mainThread = new Handler(Looper.getMainLooper()); 1273713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mainThread.post(new Runnable() { 1283713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick @Override 1293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void run() { 1303713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mEventLog.add(tag, threadId); 1313713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mEventLog.finish(this.toString()); 1323713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1333713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick }); 1343713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return; 1353713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1363713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1373713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mEventLog.add(tag, threadId); 1383713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mEventLog.finish(this.toString()); 1393713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } else { 1403713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick long requestTime = System.currentTimeMillis() - mRequestBirthTime; 1413713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (requestTime >= SLOW_REQUEST_THRESHOLD_MS) { 1423713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick VolleyLog.d("%d ms: %s", requestTime, this.toString()); 1433713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1443713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1453713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1463713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1473713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1483713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Associates this request with the given queue. The request queue will be notified when this 1493713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * request has finished. 1503713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1513713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void setRequestQueue(RequestQueue requestQueue) { 1523713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mRequestQueue = requestQueue; 1533713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1543713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1553713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1563713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Sets the sequence number of this request. Used by {@link RequestQueue}. 1573713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1583713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public final void setSequence(int sequence) { 1593713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mSequence = sequence; 1603713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1613713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1623713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1633713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the sequence number of this request. 1643713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1653713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public final int getSequence() { 1663713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (mSequence == null) { 1673713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick throw new IllegalStateException("getSequence called before setSequence"); 1683713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1693713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mSequence; 1703713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1713713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1723713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1733713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Sets whether or not this request should be suppressed by {@link RequestQueue#drain()}. 1743713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1753713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void setDrainable(boolean drainable) { 1763713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mDrainable = drainable; 1773713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1783713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1793713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1803713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns true if this request can be suppressed by {@link RequestQueue#drain()}. 1813713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1823713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public boolean isDrainable() { 1833713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mDrainable; 1843713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1853713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1863713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1873713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the URL of this request. 1883713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1893713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public String getUrl() { 1903713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mUrl; 1913713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1923713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1933713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 1943713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the cache key for this request. By default, this is the URL. 1953713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 1963713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public String getCacheKey() { 1973713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return getUrl(); 1983713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 1993713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2003713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2013713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Annotates this request with an entry retrieved for it from cache. 2023713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Used for cache coherency support. 2033713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2043713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void setCacheEntry(Cache.Entry entry) { 2053713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mCacheEntry = entry; 2063713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2073713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2083713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2093713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the annotated cache entry, or null if there isn't one. 2103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public Cache.Entry getCacheEntry() { 2123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mCacheEntry; 2133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Mark this request as canceled. No callback will be delivered. 2173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void cancel() { 2193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mCanceled = true; 2203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2233713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns true if this request has been canceled. 2243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2253713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public boolean isCanceled() { 2263713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mCanceled; 2273713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2283713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2303713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns a list of extra HTTP headers to go along with this request. Can 2313713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * throw {@link AuthFailureError} as authentication may be required to 2323713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * provide these values. 2333713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @throws AuthFailureError In the event of auth failure 2343713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2353713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public Map<String, String> getHeaders() throws AuthFailureError { 2363713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return Collections.emptyMap(); 2373713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2383713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2393713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2403713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns a Map of POST parameters to be used for this request, or null if 2413713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * a simple GET should be used. Can throw {@link AuthFailureError} as 2423713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * authentication may be required to provide these values. 2433713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 2443713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <p>Note that only one of getPostParams() and getPostBody() can return a non-null 2453713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * value.</p> 2463713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @throws AuthFailureError In the event of auth failure 2473713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2483713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick protected Map<String, String> getPostParams() throws AuthFailureError { 2493713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return null; 2503713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2513713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2523713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2533713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns which encoding should be used when converting POST parameters returned by 2543713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * {@link #getPostParams()} into a raw POST body. 2553713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 2563713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <p>This controls both encodings: 2573713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <ol> 2583713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <li>The string encoding used when converting parameter names and values into bytes prior 2593713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * to URL encoding them.</li> 2603713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <li>The string encoding used when converting the URL encoded parameters into a raw 2613713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * byte array.</li> 2623713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * </ol> 2633713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2643713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick protected String getPostParamsEncoding() { 2653713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return DEFAULT_POST_PARAMS_ENCODING; 2663713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2673713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2683713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public String getPostBodyContentType() { 2693713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return "application/x-www-form-urlencoded; charset=" + getPostParamsEncoding(); 2703713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2713713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2723713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2733713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the raw POST body to be sent. 2743713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 2753713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @throws AuthFailureError In the event of auth failure 2763713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2773713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public byte[] getPostBody() throws AuthFailureError { 2783713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Map<String, String> postParams = getPostParams(); 2793713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (postParams != null && postParams.size() > 0) { 2803713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return encodePostParameters(postParams, getPostParamsEncoding()); 2813713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2823713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return null; 2833713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2843713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 2853713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 2863713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Converts <code>postParams</code> into an application/x-www-form-urlencoded encoded string. 2873713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 2883713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private byte[] encodePostParameters(Map<String, String> postParams, String postParamsEncoding) { 2893713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick StringBuilder encodedParams = new StringBuilder(); 2903713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick try { 2913713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick for (Map.Entry<String, String> entry : postParams.entrySet()) { 2923713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick encodedParams.append(URLEncoder.encode(entry.getKey(), postParamsEncoding)); 2933713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick encodedParams.append('='); 2943713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick encodedParams.append(URLEncoder.encode(entry.getValue(), postParamsEncoding)); 2953713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick encodedParams.append('&'); 2963713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 2973713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return encodedParams.toString().getBytes(postParamsEncoding); 2983713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } catch (UnsupportedEncodingException uee) { 2993713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick throw new RuntimeException("Encoding not supported: " + postParamsEncoding, uee); 3003713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3013713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3023713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3033713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3043713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Set whether or not responses to this request should be cached. 3053713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3063713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public final void setShouldCache(boolean shouldCache) { 3073713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mShouldCache = shouldCache; 3083713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3093713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns true if responses to this request should be cached. 3123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public final boolean shouldCache() { 3143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mShouldCache; 3153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Priority values. Requests will be processed from higher priorities to 3193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * lower priorities, in FIFO order. 3203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public enum Priority { 3223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick LOW, 3233713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick NORMAL, 3243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick HIGH, 3253713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick IMMEDIATE 3263713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3273713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3283713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the {@link Priority} of this request; {@link Priority#NORMAL} by default. 3303713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3313713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public Priority getPriority() { 3323713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return Priority.NORMAL; 3333713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3343713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3353713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3363713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the socket timeout in milliseconds per retry attempt. (This value can be changed 3373713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * per retry attempt if a backoff is specified via backoffTimeout()). If there are no retry 3383713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * attempts remaining, this will cause delivery of a {@link TimeoutError} error. 3393713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3403713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public final int getTimeoutMs() { 3413713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mRetryPolicy.getCurrentTimeout(); 3423713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3433713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3443713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3453713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns the retry policy that should be used for this request. 3463713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3473713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public RetryPolicy getRetryPolicy() { 3483713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mRetryPolicy; 3493713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3503713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3513713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3523713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Mark this request as having a response delivered on it. This can be used 3533713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * later in the request's lifetime for suppressing identical responses. 3543713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3553713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void markDelivered() { 3563713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mResponseDelivered = true; 3573713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3583713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3593713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3603713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Returns true if this request has had a response delivered for it. 3613713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3623713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public boolean hasHadResponseDelivered() { 3633713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return mResponseDelivered; 3643713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3653713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3663713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3673713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Subclasses must implement this to parse the raw network response 3683713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * and return an appropriate response type. This method will be 3693713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * called from a worker thread. The response will not be delivered 3703713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * if you return null. 3713713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @param response Response from the network 3723713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @return The parsed response, or null in the case of an error 3733713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3743713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick abstract protected Response<T> parseNetworkResponse(NetworkResponse response); 3753713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3763713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3773713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Subclasses can override this method to parse 'networkError' and return a more specific error. 3783713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 3793713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * <p>The default implementation just returns the passed 'networkError'.</p> 3803713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 3813713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @param volleyError the error retrieved from the network 3823713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @return an NetworkError augmented with additional information 3833713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3843713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick protected VolleyError parseNetworkError(VolleyError volleyError) { 3853713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return volleyError; 3863713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 3873713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3883713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3893713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Subclasses must implement this to perform delivery of the parsed 3903713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * response to their listeners. The given response is guaranteed to 3913713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * be non-null; responses that fail to parse are not delivered. 3923713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @param response The parsed response returned by 3933713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * {@link #parseNetworkResponse(NetworkResponse)} 3943713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 3953713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick abstract protected void deliverResponse(T response); 3963713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 3973713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 3983713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Delivers error message to the ErrorListener that the Request was 3993713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * initialized with. 4003713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 4013713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * @param error Error details 4023713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 4033713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void deliverError(VolleyError error) { 4043713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick if (mErrorListener != null) { 4053713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick mErrorListener.onErrorResponse(error); 4063713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 4073713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 4083713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 4093713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick /** 4103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Our comparator sorts from high to low priority, and secondarily by 4113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * sequence number to provide FIFO ordering. 4123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 4133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick @Override 4143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public int compareTo(Request<T> other) { 4153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Priority left = this.getPriority(); 4163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Priority right = other.getPriority(); 4173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 4183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // High-priority requests are "lesser" so they are sorted to the front. 4193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // Equal priorities are sorted by sequence number to provide FIFO ordering. 4203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return left == right ? 4213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick this.mSequence - other.mSequence : 4223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick right.ordinal() - left.ordinal(); 4233713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 4243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 4253713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick @Override 4263713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public String toString() { 4273713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return (mCanceled ? "[X] " : "[ ] ") + getUrl() + " " + getPriority() + " " + mSequence; 4283713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 4293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick} 430