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