aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnonymous <no-reply@google.com>2021-07-09 17:08:27 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-07-09 17:08:27 +0000
commitf33c2e45dc1216afdbf25b5ef332bac873af3771 (patch)
treecf5d56ccdb862fd9676c855f919408ef940bc019
parent24517b4559c8a823510769f268af200e939c3278 (diff)
parentf77c53c3a34a3e52bbe132e24735ec2bab9f7cee (diff)
downloadvolley-f33c2e45dc1216afdbf25b5ef332bac873af3771.tar.gz
Original change: https://android-review.googlesource.com/c/platform/external/volley/+/1758419 Change-Id: Ia7e4c5c5a33254d3b363a718710544d6b817e1a4
-rw-r--r--.github/workflows/gradle-build.yaml28
-rw-r--r--.travis.yml41
-rw-r--r--Android.bp3
-rw-r--r--bintray.gradle78
-rw-r--r--build.gradle104
-rw-r--r--core/build.gradle28
-rw-r--r--core/consumer-proguard-rules.pro (renamed from consumer-proguard-rules.pro)0
-rw-r--r--core/src/main/AndroidManifest.xml (renamed from src/main/AndroidManifest.xml)0
-rw-r--r--core/src/main/java/com/android/volley/AsyncCache.java (renamed from src/main/java/com/android/volley/AsyncCache.java)7
-rw-r--r--core/src/main/java/com/android/volley/AsyncNetwork.java (renamed from src/main/java/com/android/volley/AsyncNetwork.java)7
-rw-r--r--core/src/main/java/com/android/volley/AsyncRequestQueue.java (renamed from src/main/java/com/android/volley/AsyncRequestQueue.java)124
-rw-r--r--core/src/main/java/com/android/volley/AuthFailureError.java (renamed from src/main/java/com/android/volley/AuthFailureError.java)0
-rw-r--r--core/src/main/java/com/android/volley/Cache.java (renamed from src/main/java/com/android/volley/Cache.java)12
-rw-r--r--core/src/main/java/com/android/volley/CacheDispatcher.java (renamed from src/main/java/com/android/volley/CacheDispatcher.java)10
-rw-r--r--core/src/main/java/com/android/volley/ClientError.java (renamed from src/main/java/com/android/volley/ClientError.java)0
-rw-r--r--core/src/main/java/com/android/volley/DefaultRetryPolicy.java (renamed from src/main/java/com/android/volley/DefaultRetryPolicy.java)0
-rw-r--r--core/src/main/java/com/android/volley/ExecutorDelivery.java (renamed from src/main/java/com/android/volley/ExecutorDelivery.java)0
-rw-r--r--core/src/main/java/com/android/volley/Header.java (renamed from src/main/java/com/android/volley/Header.java)0
-rw-r--r--core/src/main/java/com/android/volley/Network.java (renamed from src/main/java/com/android/volley/Network.java)0
-rw-r--r--core/src/main/java/com/android/volley/NetworkDispatcher.java (renamed from src/main/java/com/android/volley/NetworkDispatcher.java)0
-rw-r--r--core/src/main/java/com/android/volley/NetworkError.java (renamed from src/main/java/com/android/volley/NetworkError.java)0
-rw-r--r--core/src/main/java/com/android/volley/NetworkResponse.java (renamed from src/main/java/com/android/volley/NetworkResponse.java)0
-rw-r--r--core/src/main/java/com/android/volley/NoConnectionError.java (renamed from src/main/java/com/android/volley/NoConnectionError.java)0
-rw-r--r--core/src/main/java/com/android/volley/ParseError.java (renamed from src/main/java/com/android/volley/ParseError.java)0
-rw-r--r--core/src/main/java/com/android/volley/Request.java (renamed from src/main/java/com/android/volley/Request.java)12
-rw-r--r--core/src/main/java/com/android/volley/RequestQueue.java (renamed from src/main/java/com/android/volley/RequestQueue.java)0
-rw-r--r--core/src/main/java/com/android/volley/RequestTask.java (renamed from src/main/java/com/android/volley/RequestTask.java)7
-rw-r--r--core/src/main/java/com/android/volley/Response.java (renamed from src/main/java/com/android/volley/Response.java)0
-rw-r--r--core/src/main/java/com/android/volley/ResponseDelivery.java (renamed from src/main/java/com/android/volley/ResponseDelivery.java)0
-rw-r--r--core/src/main/java/com/android/volley/RetryPolicy.java (renamed from src/main/java/com/android/volley/RetryPolicy.java)0
-rw-r--r--core/src/main/java/com/android/volley/ServerError.java (renamed from src/main/java/com/android/volley/ServerError.java)0
-rw-r--r--core/src/main/java/com/android/volley/TimeoutError.java (renamed from src/main/java/com/android/volley/TimeoutError.java)0
-rw-r--r--core/src/main/java/com/android/volley/VolleyError.java (renamed from src/main/java/com/android/volley/VolleyError.java)0
-rw-r--r--core/src/main/java/com/android/volley/VolleyLog.java (renamed from src/main/java/com/android/volley/VolleyLog.java)0
-rw-r--r--core/src/main/java/com/android/volley/WaitingRequestManager.java (renamed from src/main/java/com/android/volley/WaitingRequestManager.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java (renamed from src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/AsyncHttpStack.java)7
-rw-r--r--core/src/main/java/com/android/volley/toolbox/Authenticator.java (renamed from src/main/java/com/android/volley/toolbox/Authenticator.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/BaseHttpStack.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java (renamed from src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java)42
-rw-r--r--core/src/main/java/com/android/volley/toolbox/BasicNetwork.java (renamed from src/main/java/com/android/volley/toolbox/BasicNetwork.java)8
-rw-r--r--core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java (renamed from src/main/java/com/android/volley/toolbox/ByteArrayPool.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java (renamed from src/main/java/com/android/volley/toolbox/ClearCacheRequest.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java (renamed from src/main/java/com/android/volley/toolbox/DiskBasedCache.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/FileSupplier.java (renamed from src/main/java/com/android/volley/toolbox/FileSupplier.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HttpClientStack.java (renamed from src/main/java/com/android/volley/toolbox/HttpClientStack.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java (renamed from src/main/java/com/android/volley/toolbox/HttpHeaderParser.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HttpResponse.java (renamed from src/main/java/com/android/volley/toolbox/HttpResponse.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HttpStack.java (renamed from src/main/java/com/android/volley/toolbox/HttpStack.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/HurlStack.java (renamed from src/main/java/com/android/volley/toolbox/HurlStack.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/ImageLoader.java (renamed from src/main/java/com/android/volley/toolbox/ImageLoader.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/ImageRequest.java (renamed from src/main/java/com/android/volley/toolbox/ImageRequest.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonArrayRequest.java)7
-rw-r--r--core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonObjectRequest.java)37
-rw-r--r--core/src/main/java/com/android/volley/toolbox/JsonRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonRequest.java)10
-rw-r--r--core/src/main/java/com/android/volley/toolbox/NetworkImageView.java (renamed from src/main/java/com/android/volley/toolbox/NetworkImageView.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/NetworkUtility.java (renamed from src/main/java/com/android/volley/toolbox/NetworkUtility.java)62
-rw-r--r--core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java (renamed from src/main/java/com/android/volley/toolbox/NoAsyncCache.java)7
-rw-r--r--core/src/main/java/com/android/volley/toolbox/NoCache.java (renamed from src/main/java/com/android/volley/toolbox/NoCache.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java (renamed from src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/RequestFuture.java (renamed from src/main/java/com/android/volley/toolbox/RequestFuture.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/StringRequest.java (renamed from src/main/java/com/android/volley/toolbox/StringRequest.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/Threads.java (renamed from src/main/java/com/android/volley/toolbox/Threads.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/UrlRewriter.java (renamed from src/main/java/com/android/volley/toolbox/UrlRewriter.java)0
-rw-r--r--core/src/main/java/com/android/volley/toolbox/Volley.java (renamed from src/main/java/com/android/volley/toolbox/Volley.java)5
-rw-r--r--core/src/test/java/com/android/volley/AsyncRequestQueueTest.java (renamed from src/test/java/com/android/volley/AsyncRequestQueueTest.java)88
-rw-r--r--core/src/test/java/com/android/volley/CacheDispatcherTest.java (renamed from src/test/java/com/android/volley/CacheDispatcherTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/NetworkDispatcherTest.java (renamed from src/test/java/com/android/volley/NetworkDispatcherTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/NetworkResponseTest.java (renamed from src/test/java/com/android/volley/NetworkResponseTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java (renamed from src/test/java/com/android/volley/RequestQueueIntegrationTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/RequestQueueTest.java (renamed from src/test/java/com/android/volley/RequestQueueTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/RequestTest.java (renamed from src/test/java/com/android/volley/RequestTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/ResponseDeliveryTest.java (renamed from src/test/java/com/android/volley/ResponseDeliveryTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/mock/MockAsyncStack.java (renamed from src/test/java/com/android/volley/mock/MockAsyncStack.java)0
-rw-r--r--core/src/test/java/com/android/volley/mock/MockHttpStack.java (renamed from src/test/java/com/android/volley/mock/MockHttpStack.java)0
-rw-r--r--core/src/test/java/com/android/volley/mock/MockRequest.java (renamed from src/test/java/com/android/volley/mock/MockRequest.java)0
-rw-r--r--core/src/test/java/com/android/volley/mock/ShadowSystemClock.java (renamed from src/test/java/com/android/volley/mock/ShadowSystemClock.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java (renamed from src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java (renamed from src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java (renamed from src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java (renamed from src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java (renamed from src/test/java/com/android/volley/toolbox/BasicNetworkTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java (renamed from src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/CacheTest.java (renamed from src/test/java/com/android/volley/toolbox/CacheTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java (renamed from src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpClientStackTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/HurlStackTest.java (renamed from src/test/java/com/android/volley/toolbox/HurlStackTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java (renamed from src/test/java/com/android/volley/toolbox/ImageLoaderTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/ImageRequestTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java (renamed from src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/JsonRequestTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java (renamed from src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java (renamed from src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestFutureTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestQueueTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/RequestTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/ResponseTest.java (renamed from src/test/java/com/android/volley/toolbox/ResponseTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/toolbox/StringRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/StringRequestTest.java)0
-rw-r--r--core/src/test/java/com/android/volley/utils/CacheTestUtils.java (renamed from src/test/java/com/android/volley/utils/CacheTestUtils.java)0
-rw-r--r--core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java (renamed from src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java)0
-rw-r--r--core/src/test/resources/org.robolectric.Config.properties (renamed from src/test/resources/org.robolectric.Config.properties)0
-rw-r--r--cronet/build.gradle24
-rw-r--r--cronet/src/main/AndroidManifest.xml2
-rw-r--r--cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java (renamed from src/main/java/com/android/volley/cronet/CronetHttpStack.java)3
-rw-r--r--cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java (renamed from src/test/java/com/android/volley/cronet/CronetHttpStackTest.java)0
-rwxr-xr-xpublish-snapshot-on-commit.sh16
-rw-r--r--publish.gradle72
-rw-r--r--rules.gradle36
-rw-r--r--settings.gradle4
-rw-r--r--testing/build.gradle4
-rw-r--r--testing/src/main/AndroidManifest.xml2
-rw-r--r--testing/src/main/java/com/android/volley/mock/TestRequest.java (renamed from src/test/java/com/android/volley/mock/TestRequest.java)0
115 files changed, 560 insertions, 337 deletions
diff --git a/.github/workflows/gradle-build.yaml b/.github/workflows/gradle-build.yaml
new file mode 100644
index 0000000..c42648c
--- /dev/null
+++ b/.github/workflows/gradle-build.yaml
@@ -0,0 +1,28 @@
+name: Gradle
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ - name: Cache Gradle packages
+ uses: actions/cache@v2
+ with:
+ path: ~/.gradle/caches
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
+ restore-keys: ${{ runner.os }}-gradle
+ - name: Build with Gradle
+ run: ./gradlew --continue verifyGoogleJavaFormat build connectedCheck
+ - name: Publish snapshot
+ if: github.event_name == 'push'
+ env:
+ OSSRH_DEPLOY_USERNAME: ${{ secrets.OSSRH_DEPLOY_USERNAME }}
+ OSSRH_DEPLOY_PASSWORD: ${{ secrets.OSSRH_DEPLOY_PASSWORD }}
+ run: ./publish-snapshot-on-commit.sh
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index fb6481a..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-language: android
-android:
- licenses:
- - 'android-sdk-preview-license-.+'
- - 'android-sdk-license-.+'
- - 'google-gdk-license-.+'
-
- components:
- # Workaround to be able to install v28 SDK and build tools.
- # See https://github.com/travis-ci/travis-ci/issues/6040
- - tools # to update the repository XML files
- - tools # to update the SDK tools themselves
-
- - platform-tools
- - build-tools-28.0.3
- - android-28
-
-jdk:
- - oraclejdk8
-
-# Avoid uploading the cache after every build
-# See https://docs.travis-ci.com/user/languages/android/
-before_cache:
- - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
- - rm -fr $HOME/.gradle/caches/*/classAnalysis/
- - rm -fr $HOME/.gradle/caches/*/workerMain/
-cache:
- directories:
- - $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
- - $HOME/.android/build-cache
-
-env:
- global:
- - secure: "ObTSgg1H/RoQwhf9735Cr0OEs7r296aQTKiVOmQYSIxZPzc7o2KveSVV8IVeQ+VQtDxPFij6Odk4gaQSKVytliTlgtSsrEaYt67yWWYLWBLWbnzLNYoWMMy+36O5BK78RNtVJ3Xr1mdMcZ2+SRj2TcEvQBqMWlUkJfEcmJttreq0Wd7jiNitv5MbyYRcd2AvKaqNilx5rEm1ihbE0wT3lH20EdAjjjckaBT04r+VXU9e0dg6tmZjqG8dxGzxYHLRTz7nmKXlUnOJ3steNPrmR/AsGqKW6Ppowi31t3iLpL3zdT0+mvzfvnQwBodqHWSU/JhVDGlePv+4a5aU80s+5nN1IKL7tTLGYWoKdoIuQLovRkdcdkuj8UNyftPj6qOO2C9Tk8j64WXwUIDRnmNfjXbFzqN51oiT94G6hPcEDQSxLwuqlmgNm9I9WxZidb5YotIN2BcIKthAvdL4ecxE5INJvss8DVdYUZ53000GqSoMv8WET6jYkSJPKfvmTgpqqYIW0sgMiDfO/ta/MTFG5kSqECL+sAFZNmugwmTc7NIdy29myCyLH/A6oM4n3QeFDDHhOl2cRYlsX3juzw2goRppR9sEosFN0D1T7Fije5RmJsPgVLGwYMxSGukAHufcatKfhccUVl+haSJ3PLQ1z+25Ug2kpJwMAHbUYWCBnew="
- - secure: "Ac95rbJd5dgNdK8ZlaeXpkKYXHGNj8pm4eNv1Oe8YtsByshHtBAK1m55H4Ex55oRXaLXntvQwnnJfqeTDPuqvd7QP1fjvp4Yjdaqa8MkC6qdVtm6LaqsGuE38uSiU6oxJKfnlCywNe2LfFlbzBtPd3ejNI7tfJcO3s1mD2aBT46vmwUy0t5ESxNdP2zUs6DFcbaOUWeJhQn8iNdRm2VbHEMdevzvvXXIUB9YUdBZQIuAZ5E8NRP5/dzPE8P0CY6/yXqQ/6bkXRV3Pf9QsRzJ+oEQVJAIFfC4JAGasgaBIVpaJ2C2At39jrNFpGYUNbHxvkBEal+WiaPk5TfmVbpyWJOTPRaaY3tIRdBbYf6kklnQk2jRJB6GCi4/yvT6oNjTQQEwsuYlaivkibwNehQqtqyjj12CcTI7lwbgNXeLvIWE6LNLIxrY4pnNy3bKjA0oLFoG/FuP3Wi9WldBtVXwvUBVFFXeOgzP6lCDkzGYTwYZi20lRmSgma3Q5e3/BbPtos3BZ9dSY3lUjttGxvHEDCJ48U1aw6usR91ZKD78Thb5OxWLkvs4rjWEDU2I649wiYSyqFldNEnv+2SJSRB+097XEcnCopGXorlMhBMAlhwHyiRY1u0D+9qrpfIl9Z07j0ZiG5uIscDXQZZjMivqe/+u8NJ3kN0zrDO5BQEgNls="
-
-# Publish a SNAPSHOT build for all commits to master.
-script:
- - ./gradlew --continue verifyGoogleJavaFormat build connectedCheck && ./publish-snapshot-on-commit.sh
diff --git a/Android.bp b/Android.bp
index 803b4f2..917048f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -36,11 +36,10 @@ java_library {
name: "volley",
sdk_version: "28",
min_sdk_version: "8",
- srcs: ["src/main/java/**/*.java"],
+ srcs: ["core/src/main/java/**/*.java"],
// Exclude Cronet support for now. Can be enabled later if/when Cronet is made available as a
// compilation dependency for Volley clients.
- exclude_srcs: ["src/main/java/com/android/volley/cronet/**/*"],
libs: [
// Only needed at compile-time.
diff --git a/bintray.gradle b/bintray.gradle
deleted file mode 100644
index b642b41..0000000
--- a/bintray.gradle
+++ /dev/null
@@ -1,78 +0,0 @@
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.8.1"
- }
-}
-
-// apply the plugin with its class name rather than its Id to work around gradle limitation of
-// not being able to find the plugin by Id despite the dependencies being added right above. Gradle
-// is currently not capable of loading plugins by Id if the dependency is anywhere else than
-// in the main project build.gradle. This file is "imported" into the project's build.gradle
-// through a "apply from:".
-apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin
-apply plugin: 'maven-publish'
-
-task sourcesJar(type: Jar) {
- classifier = 'sources'
- from android.sourceSets.main.java.srcDirs
-}
-
-task javadoc(type: Javadoc) {
- source = android.sourceSets.main.java.srcDirs
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
-}
-
-task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from javadoc.destinationDir
-}
-
-artifacts {
- archives javadocJar
- archives sourcesJar
-}
-
-publishing {
- publications {
- library(MavenPublication) {
- groupId 'com.android.volley'
- artifactId 'volley'
- version project.version
- pom {
- packaging 'aar'
- licenses {
- license {
- name = "The Apache License, Version 2.0"
- url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
- }
- }
- }
-
- // Release AAR, Sources, and JavaDoc
- artifact "$buildDir/outputs/aar/volley-release.aar"
- artifact sourcesJar
- artifact javadocJar
- }
- }
-}
-
-artifactory {
- contextUrl = "https://oss.jfrog.org"
- publish {
- repository {
- repoKey = 'oss-snapshot-local'
- username = System.env.CI_DEPLOY_USERNAME
- password = System.env.CI_DEPLOY_PASSWORD
- }
- defaults {
- publications('library')
- publishArtifacts = true
- }
- }
- resolve {
- repoKey = 'jcenter'
- }
-}
diff --git a/build.gradle b/build.gradle
index 544771c..b8db952 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,76 +1,72 @@
-// NOTE: The only changes that belong in this file are the definitions
-// of tool versions (gradle plugin, compile SDK, build tools), so that
-// Volley can be built via gradle as a standalone project.
-//
-// Any other changes to the build config belong in rules.gradle, which
-// is used by projects that depend on Volley but define their own
-// tools versions across all dependencies to ensure a consistent build.
-//
-// Most users should just add this line to settings.gradle:
-// include(":volley")
-//
-// If you have a more complicated Gradle setup you can choose to use
-// this instead:
-// include(":volley")
-// project(':volley').buildFileName = 'rules.gradle'
-
-import net.ltgt.gradle.errorprone.CheckSeverity
-
buildscript {
repositories {
+ gradlePluginPortal()
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.6'
+ // NOTE: 0.7 or newer will require upgrading to a newer Android gradle plugin:
+ // https://github.com/tbroyer/gradle-errorprone-plugin/commit/65b1026ebeae1b7ed8c28578c7f6eea512c16bea
+ classpath 'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:0.6.1'
}
}
-plugins {
- id "com.github.sherter.google-java-format" version "0.6"
- // NOTE: 0.7 or newer will require upgrading to a newer Android gradle plugin:
- // https://github.com/tbroyer/gradle-errorprone-plugin/commit/65b1026ebeae1b7ed8c28578c7f6eea512c16bea
- id "net.ltgt.errorprone" version "0.6.1"
+allprojects {
+ repositories {
+ jcenter()
+ google()
+ }
}
-googleJavaFormat {
- toolVersion = '1.5'
- options style: 'AOSP'
-}
+subprojects {
+ apply plugin: 'com.github.sherter.google-java-format'
+ apply plugin: 'net.ltgt.errorprone'
-apply plugin: 'com.android.library'
+ googleJavaFormat {
+ toolVersion = '1.5'
+ options style: 'AOSP'
+ }
-repositories {
- jcenter()
- google()
-}
+ apply plugin: 'com.android.library'
-dependencies {
- // NOTE: Updating ErrorProne introduces new checks that may cause the build to fail. Pin to a
- // specific version to control these updates.
- errorprone("com.google.errorprone:error_prone_core:2.3.2")
- // ErrorProne requires a JDK 9 compiler, so pull one in as a dependency since we use Java 8:
- // https://github.com/tbroyer/gradle-errorprone-plugin#jdk-8-support
- errorproneJavac("com.google.errorprone:javac:9+181-r4173-1")
-}
+ dependencies {
+ // NOTE: Updating ErrorProne introduces new checks that may cause the build to fail. Pin to a
+ // specific version to control these updates.
+ errorprone("com.google.errorprone:error_prone_core:2.3.2")
+ // ErrorProne requires a JDK 9 compiler, so pull one in as a dependency since we use Java 8:
+ // https://github.com/tbroyer/gradle-errorprone-plugin#jdk-8-support
+ errorproneJavac("com.google.errorprone:javac:9+181-r4173-1")
+ }
+
+ group = 'com.android.volley'
+ version = '1.2.1-SNAPSHOT'
+
+ android {
+ useLibrary 'org.apache.http.legacy'
-group = 'com.android.volley'
-version = '1.2.0-SNAPSHOT'
+ compileSdkVersion 28
+ buildToolsVersion = '28.0.3'
-android {
- compileSdkVersion 28
- buildToolsVersion = '28.0.3'
+ defaultConfig {
+ minSdkVersion 8
+ }
- defaultConfig {
- minSdkVersion 8
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
}
-}
-tasks.withType(JavaCompile) {
- options.errorprone {
- check("ParameterComment", CheckSeverity.ERROR)
+ tasks.withType(JavaCompile) {
+ options.errorprone {
+ check("ParameterComment", net.ltgt.gradle.errorprone.CheckSeverity.ERROR)
+ }
+ options.compilerArgs << "-Xlint:unchecked" << "-Werror"
}
-}
-apply from: 'rules.gradle'
-apply from: 'bintray.gradle'
+ if (it.name != 'testing') {
+ apply from: '../publish.gradle'
+ }
+}
diff --git a/core/build.gradle b/core/build.gradle
new file mode 100644
index 0000000..812968c
--- /dev/null
+++ b/core/build.gradle
@@ -0,0 +1,28 @@
+android {
+ defaultConfig {
+ consumerProguardFiles 'consumer-proguard-rules.pro'
+ }
+}
+
+dependencies {
+ implementation "androidx.annotation:annotation:1.0.1"
+
+ testImplementation project(":testing")
+ testImplementation "junit:junit:4.12"
+ testImplementation "org.hamcrest:hamcrest-library:1.3"
+ testImplementation "org.mockito:mockito-core:2.19.0"
+ testImplementation "org.robolectric:robolectric:3.4.2"
+}
+
+publishing {
+ publications {
+ library(MavenPublication) {
+ artifactId 'volley'
+ pom {
+ name = 'Volley'
+ description = 'An HTTP library that makes networking for Android apps easier and, most importantly, faster.'
+ }
+ artifact "$buildDir/outputs/aar/core-release.aar"
+ }
+ }
+}
diff --git a/consumer-proguard-rules.pro b/core/consumer-proguard-rules.pro
index 38d2cf1..38d2cf1 100644
--- a/consumer-proguard-rules.pro
+++ b/core/consumer-proguard-rules.pro
diff --git a/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
index ba3a2a7..ba3a2a7 100644
--- a/src/main/AndroidManifest.xml
+++ b/core/src/main/AndroidManifest.xml
diff --git a/src/main/java/com/android/volley/AsyncCache.java b/core/src/main/java/com/android/volley/AsyncCache.java
index 3cddb4b..8b2dbcc 100644
--- a/src/main/java/com/android/volley/AsyncCache.java
+++ b/core/src/main/java/com/android/volley/AsyncCache.java
@@ -18,7 +18,12 @@ package com.android.volley;
import androidx.annotation.Nullable;
-/** Asynchronous equivalent to the {@link Cache} interface. */
+/**
+ * Asynchronous equivalent to the {@link Cache} interface.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public abstract class AsyncCache {
public interface OnGetCompleteCallback {
diff --git a/src/main/java/com/android/volley/AsyncNetwork.java b/core/src/main/java/com/android/volley/AsyncNetwork.java
index ad19c03..47f35ea 100644
--- a/src/main/java/com/android/volley/AsyncNetwork.java
+++ b/core/src/main/java/com/android/volley/AsyncNetwork.java
@@ -22,7 +22,12 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicReference;
-/** An asynchronous implementation of {@link Network} to perform requests. */
+/**
+ * An asynchronous implementation of {@link Network} to perform requests.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public abstract class AsyncNetwork implements Network {
private ExecutorService mBlockingExecutor;
private ExecutorService mNonBlockingExecutor;
diff --git a/src/main/java/com/android/volley/AsyncRequestQueue.java b/core/src/main/java/com/android/volley/AsyncRequestQueue.java
index 3754866..7bf8c21 100644
--- a/src/main/java/com/android/volley/AsyncRequestQueue.java
+++ b/core/src/main/java/com/android/volley/AsyncRequestQueue.java
@@ -25,9 +25,10 @@ import com.android.volley.AsyncCache.OnGetCompleteCallback;
import com.android.volley.AsyncNetwork.OnRequestComplete;
import com.android.volley.Cache.Entry;
import java.net.HttpURLConnection;
+import java.util.ArrayList;
import java.util.Comparator;
+import java.util.List;
import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
@@ -41,7 +42,10 @@ import java.util.concurrent.TimeUnit;
* An asynchronous request dispatch queue.
*
* <p>Add requests to the queue with {@link #add(Request)}. Once completed, responses will be
- * delivered on the main thread (unless a custom {@link ResponseDelivery} has been provided)
+ * delivered on the main thread (unless a custom {@link ResponseDelivery} has been provided).
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
*/
public class AsyncRequestQueue extends RequestQueue {
/** Default number of blocking threads to start. */
@@ -83,6 +87,17 @@ public class AsyncRequestQueue extends RequestQueue {
private final WaitingRequestManager mWaitingRequestManager = new WaitingRequestManager(this);
/**
+ * Requests which have been queued before cache initialization has completed.
+ *
+ * <p>These requests are kicked off once cache initialization finishes. We avoid enqueuing them
+ * sooner as the cache may not yet be ready.
+ */
+ private final List<Request<?>> mRequestsAwaitingCacheInitialization = new ArrayList<>();
+
+ private volatile boolean mIsCacheInitialized = false;
+ private final Object mCacheInitializationLock = new Object[0];
+
+ /**
* Sets all the variables, but processing does not begin until {@link #start()} is called.
*
* @param cache to use for persisting responses to disk. If an AsyncCache was provided, then
@@ -119,34 +134,37 @@ public class AsyncRequestQueue extends RequestQueue {
mNetwork.setNonBlockingExecutor(mNonBlockingExecutor);
mNetwork.setNonBlockingScheduledExecutor(mNonBlockingScheduledExecutor);
- mNonBlockingExecutor.execute(
- new Runnable() {
- @Override
- public void run() {
- // This is intentionally blocking, because we don't want to process any
- // requests until the cache is initialized.
- if (mAsyncCache != null) {
- final CountDownLatch latch = new CountDownLatch(1);
+ // Kick off cache initialization, which must complete before any requests can be processed.
+ if (mAsyncCache != null) {
+ mNonBlockingExecutor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
mAsyncCache.initialize(
new AsyncCache.OnWriteCompleteCallback() {
@Override
public void onWriteComplete() {
- latch.countDown();
+ onCacheInitializationComplete();
}
});
- try {
- latch.await();
- } catch (InterruptedException e) {
- VolleyLog.e(
- e, "Thread was interrupted while initializing the cache.");
- Thread.currentThread().interrupt();
- throw new RuntimeException(e);
- }
- } else {
+ }
+ });
+ } else {
+ mBlockingExecutor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
getCache().initialize();
+ mNonBlockingExecutor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
+ onCacheInitializationComplete();
+ }
+ });
}
- }
- });
+ });
+ }
}
/** Shuts down and nullifies both executors */
@@ -169,6 +187,17 @@ public class AsyncRequestQueue extends RequestQueue {
/** Begins the request by sending it to the Cache or Network. */
@Override
<T> void beginRequest(Request<T> request) {
+ // If the cache hasn't been initialized yet, add the request to a temporary queue to be
+ // flushed once initialization completes.
+ if (!mIsCacheInitialized) {
+ synchronized (mCacheInitializationLock) {
+ if (!mIsCacheInitialized) {
+ mRequestsAwaitingCacheInitialization.add(request);
+ return;
+ }
+ }
+ }
+
// If the request is uncacheable, send it over the network.
if (request.shouldCache()) {
if (mAsyncCache != null) {
@@ -181,6 +210,20 @@ public class AsyncRequestQueue extends RequestQueue {
}
}
+ private void onCacheInitializationComplete() {
+ List<Request<?>> requestsToDispatch;
+ synchronized (mCacheInitializationLock) {
+ requestsToDispatch = new ArrayList<>(mRequestsAwaitingCacheInitialization);
+ mRequestsAwaitingCacheInitialization.clear();
+ mIsCacheInitialized = true;
+ }
+
+ // Kick off any requests that were queued while waiting for cache initialization.
+ for (Request<?> request : requestsToDispatch) {
+ beginRequest(request);
+ }
+ }
+
@Override
<T> void sendRequestOverNetwork(Request<T> request) {
mNonBlockingExecutor.execute(new NetworkTask<>(request));
@@ -230,8 +273,14 @@ public class AsyncRequestQueue extends RequestQueue {
return;
}
+ // Use a single instant to evaluate cache expiration. Otherwise, a cache entry with
+ // identical soft and hard TTL times may appear to be valid when checking isExpired but
+ // invalid upon checking refreshNeeded(), triggering a soft TTL refresh which should be
+ // impossible.
+ long currentTimeMillis = System.currentTimeMillis();
+
// If it is completely expired, just send it to the network.
- if (entry.isExpired()) {
+ if (entry.isExpired(currentTimeMillis)) {
mRequest.addMarker("cache-hit-expired");
mRequest.setCacheEntry(entry);
if (!mWaitingRequestManager.maybeAddToWaitingRequests(mRequest)) {
@@ -241,15 +290,17 @@ public class AsyncRequestQueue extends RequestQueue {
}
// We have a cache hit; parse its data for delivery back to the request.
- mBlockingExecutor.execute(new CacheParseTask<>(mRequest, entry));
+ mBlockingExecutor.execute(new CacheParseTask<>(mRequest, entry, currentTimeMillis));
}
private class CacheParseTask<T> extends RequestTask<T> {
Cache.Entry entry;
+ long startTimeMillis;
- CacheParseTask(Request<T> request, Cache.Entry entry) {
+ CacheParseTask(Request<T> request, Cache.Entry entry, long startTimeMillis) {
super(request);
this.entry = entry;
+ this.startTimeMillis = startTimeMillis;
}
@Override
@@ -265,7 +316,7 @@ public class AsyncRequestQueue extends RequestQueue {
entry.allResponseHeaders));
mRequest.addMarker("cache-hit-parsed");
- if (!entry.refreshNeeded()) {
+ if (!entry.refreshNeeded(startTimeMillis)) {
// Completely unexpired cache hit. Just deliver the response.
getResponseDelivery().postResponse(mRequest, response);
} else {
@@ -436,17 +487,24 @@ public class AsyncRequestQueue extends RequestQueue {
}
/**
- * This class may be used by advanced applications to provide custom executors according to
- * their needs. Apps must create ExecutorServices dynamically given a blocking queue rather than
- * providing them directly so that Volley can provide a PriorityQueue which will prioritize
- * requests according to Request#getPriority.
+ * Factory to create/provide the executors which Volley will use.
+ *
+ * <p>This class may be used by advanced applications to provide custom executors according to
+ * their needs.
+ *
+ * <p>For applications which rely on setting request priority via {@link Request#getPriority}, a
+ * task queue is provided which will prioritize requests of higher priority should the thread
+ * pool itself be exhausted. If a shared pool is provided which does not make use of the given
+ * queue, then lower-priority requests may have tasks executed before higher-priority requests
+ * when enough tasks are in flight to fully saturate the shared pool.
*/
public abstract static class ExecutorFactory {
- abstract ExecutorService createNonBlockingExecutor(BlockingQueue<Runnable> taskQueue);
+ public abstract ExecutorService createNonBlockingExecutor(
+ BlockingQueue<Runnable> taskQueue);
- abstract ExecutorService createBlockingExecutor(BlockingQueue<Runnable> taskQueue);
+ public abstract ExecutorService createBlockingExecutor(BlockingQueue<Runnable> taskQueue);
- abstract ScheduledExecutorService createNonBlockingScheduledExecutor();
+ public abstract ScheduledExecutorService createNonBlockingScheduledExecutor();
}
/** Provides a BlockingQueue to be used to create executors. */
diff --git a/src/main/java/com/android/volley/AuthFailureError.java b/core/src/main/java/com/android/volley/AuthFailureError.java
index fc6417e..fc6417e 100644
--- a/src/main/java/com/android/volley/AuthFailureError.java
+++ b/core/src/main/java/com/android/volley/AuthFailureError.java
diff --git a/src/main/java/com/android/volley/Cache.java b/core/src/main/java/com/android/volley/Cache.java
index b8908ac..7348d0f 100644
--- a/src/main/java/com/android/volley/Cache.java
+++ b/core/src/main/java/com/android/volley/Cache.java
@@ -102,12 +102,20 @@ public interface Cache {
/** True if the entry is expired. */
public boolean isExpired() {
- return this.ttl < System.currentTimeMillis();
+ return isExpired(System.currentTimeMillis());
+ }
+
+ boolean isExpired(long currentTimeMillis) {
+ return this.ttl < currentTimeMillis;
}
/** True if a refresh is needed from the original data source. */
public boolean refreshNeeded() {
- return this.softTtl < System.currentTimeMillis();
+ return refreshNeeded(System.currentTimeMillis());
+ }
+
+ boolean refreshNeeded(long currentTimeMillis) {
+ return this.softTtl < currentTimeMillis;
}
}
}
diff --git a/src/main/java/com/android/volley/CacheDispatcher.java b/core/src/main/java/com/android/volley/CacheDispatcher.java
index 1bfc0ea..4443143 100644
--- a/src/main/java/com/android/volley/CacheDispatcher.java
+++ b/core/src/main/java/com/android/volley/CacheDispatcher.java
@@ -138,8 +138,14 @@ public class CacheDispatcher extends Thread {
return;
}
+ // Use a single instant to evaluate cache expiration. Otherwise, a cache entry with
+ // identical soft and hard TTL times may appear to be valid when checking isExpired but
+ // invalid upon checking refreshNeeded(), triggering a soft TTL refresh which should be
+ // impossible.
+ long currentTimeMillis = System.currentTimeMillis();
+
// If it is completely expired, just send it to the network.
- if (entry.isExpired()) {
+ if (entry.isExpired(currentTimeMillis)) {
request.addMarker("cache-hit-expired");
request.setCacheEntry(entry);
if (!mWaitingRequestManager.maybeAddToWaitingRequests(request)) {
@@ -164,7 +170,7 @@ public class CacheDispatcher extends Thread {
}
return;
}
- if (!entry.refreshNeeded()) {
+ if (!entry.refreshNeeded(currentTimeMillis)) {
// Completely unexpired cache hit. Just deliver the response.
mDelivery.postResponse(request, response);
} else {
diff --git a/src/main/java/com/android/volley/ClientError.java b/core/src/main/java/com/android/volley/ClientError.java
index 521b76f..521b76f 100644
--- a/src/main/java/com/android/volley/ClientError.java
+++ b/core/src/main/java/com/android/volley/ClientError.java
diff --git a/src/main/java/com/android/volley/DefaultRetryPolicy.java b/core/src/main/java/com/android/volley/DefaultRetryPolicy.java
index 4be6b50..4be6b50 100644
--- a/src/main/java/com/android/volley/DefaultRetryPolicy.java
+++ b/core/src/main/java/com/android/volley/DefaultRetryPolicy.java
diff --git a/src/main/java/com/android/volley/ExecutorDelivery.java b/core/src/main/java/com/android/volley/ExecutorDelivery.java
index fd992f9..fd992f9 100644
--- a/src/main/java/com/android/volley/ExecutorDelivery.java
+++ b/core/src/main/java/com/android/volley/ExecutorDelivery.java
diff --git a/src/main/java/com/android/volley/Header.java b/core/src/main/java/com/android/volley/Header.java
index cd9c6ec..cd9c6ec 100644
--- a/src/main/java/com/android/volley/Header.java
+++ b/core/src/main/java/com/android/volley/Header.java
diff --git a/src/main/java/com/android/volley/Network.java b/core/src/main/java/com/android/volley/Network.java
index 16d5858..16d5858 100644
--- a/src/main/java/com/android/volley/Network.java
+++ b/core/src/main/java/com/android/volley/Network.java
diff --git a/src/main/java/com/android/volley/NetworkDispatcher.java b/core/src/main/java/com/android/volley/NetworkDispatcher.java
index 06057c3..06057c3 100644
--- a/src/main/java/com/android/volley/NetworkDispatcher.java
+++ b/core/src/main/java/com/android/volley/NetworkDispatcher.java
diff --git a/src/main/java/com/android/volley/NetworkError.java b/core/src/main/java/com/android/volley/NetworkError.java
index 6b2b19f..6b2b19f 100644
--- a/src/main/java/com/android/volley/NetworkError.java
+++ b/core/src/main/java/com/android/volley/NetworkError.java
diff --git a/src/main/java/com/android/volley/NetworkResponse.java b/core/src/main/java/com/android/volley/NetworkResponse.java
index cfbc371..cfbc371 100644
--- a/src/main/java/com/android/volley/NetworkResponse.java
+++ b/core/src/main/java/com/android/volley/NetworkResponse.java
diff --git a/src/main/java/com/android/volley/NoConnectionError.java b/core/src/main/java/com/android/volley/NoConnectionError.java
index 185eb35..185eb35 100644
--- a/src/main/java/com/android/volley/NoConnectionError.java
+++ b/core/src/main/java/com/android/volley/NoConnectionError.java
diff --git a/src/main/java/com/android/volley/ParseError.java b/core/src/main/java/com/android/volley/ParseError.java
index 04a9d58..04a9d58 100644
--- a/src/main/java/com/android/volley/ParseError.java
+++ b/core/src/main/java/com/android/volley/ParseError.java
diff --git a/src/main/java/com/android/volley/Request.java b/core/src/main/java/com/android/volley/Request.java
index b60dc74..df0d18f 100644
--- a/src/main/java/com/android/volley/Request.java
+++ b/core/src/main/java/com/android/volley/Request.java
@@ -135,8 +135,8 @@ public abstract class Request<T> implements Comparable<Request<T>> {
* @deprecated Use {@link #Request(int, String, com.android.volley.Response.ErrorListener)}.
*/
@Deprecated
- public Request(String url, Response.ErrorListener listener) {
- this(Method.DEPRECATED_GET_OR_POST, url, listener);
+ public Request(String url, Response.ErrorListener errorListener) {
+ this(Method.DEPRECATED_GET_OR_POST, url, errorListener);
}
/**
@@ -144,11 +144,15 @@ public abstract class Request<T> implements Comparable<Request<T>> {
* error listener. Note that the normal response listener is not provided here as delivery of
* responses is provided by subclasses, who have a better idea of how to deliver an
* already-parsed response.
+ *
+ * @param method the HTTP method to use
+ * @param url URL to fetch the response from
+ * @param errorListener Error listener, or null to ignore errors.
*/
- public Request(int method, String url, @Nullable Response.ErrorListener listener) {
+ public Request(int method, String url, @Nullable Response.ErrorListener errorListener) {
mMethod = method;
mUrl = url;
- mErrorListener = listener;
+ mErrorListener = errorListener;
setRetryPolicy(new DefaultRetryPolicy());
mDefaultTrafficStatsTag = findDefaultTrafficStatsTag(url);
diff --git a/src/main/java/com/android/volley/RequestQueue.java b/core/src/main/java/com/android/volley/RequestQueue.java
index 6db0b1c..6db0b1c 100644
--- a/src/main/java/com/android/volley/RequestQueue.java
+++ b/core/src/main/java/com/android/volley/RequestQueue.java
diff --git a/src/main/java/com/android/volley/RequestTask.java b/core/src/main/java/com/android/volley/RequestTask.java
index 8eeaf2c..b429f79 100644
--- a/src/main/java/com/android/volley/RequestTask.java
+++ b/core/src/main/java/com/android/volley/RequestTask.java
@@ -1,6 +1,11 @@
package com.android.volley;
-/** Abstract runnable that's a task to be completed by the RequestQueue. */
+/**
+ * Abstract runnable that's a task to be completed by the RequestQueue.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public abstract class RequestTask<T> implements Runnable {
final Request<T> mRequest;
diff --git a/src/main/java/com/android/volley/Response.java b/core/src/main/java/com/android/volley/Response.java
index 622bdc4..622bdc4 100644
--- a/src/main/java/com/android/volley/Response.java
+++ b/core/src/main/java/com/android/volley/Response.java
diff --git a/src/main/java/com/android/volley/ResponseDelivery.java b/core/src/main/java/com/android/volley/ResponseDelivery.java
index 10aa137..10aa137 100644
--- a/src/main/java/com/android/volley/ResponseDelivery.java
+++ b/core/src/main/java/com/android/volley/ResponseDelivery.java
diff --git a/src/main/java/com/android/volley/RetryPolicy.java b/core/src/main/java/com/android/volley/RetryPolicy.java
index 3ef26de..3ef26de 100644
--- a/src/main/java/com/android/volley/RetryPolicy.java
+++ b/core/src/main/java/com/android/volley/RetryPolicy.java
diff --git a/src/main/java/com/android/volley/ServerError.java b/core/src/main/java/com/android/volley/ServerError.java
index 84b2eb4..84b2eb4 100644
--- a/src/main/java/com/android/volley/ServerError.java
+++ b/core/src/main/java/com/android/volley/ServerError.java
diff --git a/src/main/java/com/android/volley/TimeoutError.java b/core/src/main/java/com/android/volley/TimeoutError.java
index 227ae08..227ae08 100644
--- a/src/main/java/com/android/volley/TimeoutError.java
+++ b/core/src/main/java/com/android/volley/TimeoutError.java
diff --git a/src/main/java/com/android/volley/VolleyError.java b/core/src/main/java/com/android/volley/VolleyError.java
index 45086da..45086da 100644
--- a/src/main/java/com/android/volley/VolleyError.java
+++ b/core/src/main/java/com/android/volley/VolleyError.java
diff --git a/src/main/java/com/android/volley/VolleyLog.java b/core/src/main/java/com/android/volley/VolleyLog.java
index 8477668..8477668 100644
--- a/src/main/java/com/android/volley/VolleyLog.java
+++ b/core/src/main/java/com/android/volley/VolleyLog.java
diff --git a/src/main/java/com/android/volley/WaitingRequestManager.java b/core/src/main/java/com/android/volley/WaitingRequestManager.java
index 682e339..682e339 100644
--- a/src/main/java/com/android/volley/WaitingRequestManager.java
+++ b/core/src/main/java/com/android/volley/WaitingRequestManager.java
diff --git a/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java b/core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java
index c75c25f..c75c25f 100644
--- a/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java
diff --git a/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java b/core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java
index f3381ae..f3381ae 100644
--- a/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java
+++ b/core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java
diff --git a/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java b/core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java
index bafab8c..4165637 100644
--- a/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java
@@ -28,7 +28,12 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicReference;
-/** Asynchronous extension of the {@link BaseHttpStack} class. */
+/**
+ * Asynchronous extension of the {@link BaseHttpStack} class.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public abstract class AsyncHttpStack extends BaseHttpStack {
private ExecutorService mBlockingExecutor;
private ExecutorService mNonBlockingExecutor;
diff --git a/src/main/java/com/android/volley/toolbox/Authenticator.java b/core/src/main/java/com/android/volley/toolbox/Authenticator.java
index 2ba43db..2ba43db 100644
--- a/src/main/java/com/android/volley/toolbox/Authenticator.java
+++ b/core/src/main/java/com/android/volley/toolbox/Authenticator.java
diff --git a/src/main/java/com/android/volley/toolbox/BaseHttpStack.java b/core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java
index 99a9899..99a9899 100644
--- a/src/main/java/com/android/volley/toolbox/BaseHttpStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java
diff --git a/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java b/core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java
index 55892a0..cdedaff 100644
--- a/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java
+++ b/core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java
@@ -29,6 +29,7 @@ import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestTask;
import com.android.volley.VolleyError;
+import com.android.volley.toolbox.NetworkUtility.RetryInfo;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
@@ -36,7 +37,12 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
-/** A network performing Volley requests over an {@link HttpStack}. */
+/**
+ * A network performing Volley requests over an {@link HttpStack}.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public class BasicAsyncNetwork extends AsyncNetwork {
private final AsyncHttpStack mAsyncStack;
@@ -126,13 +132,39 @@ public class BasicAsyncNetwork extends AsyncNetwork {
@Nullable HttpResponse httpResponse,
@Nullable byte[] responseContents) {
try {
- NetworkUtility.handleException(
- request, exception, requestStartMs, httpResponse, responseContents);
+ RetryInfo retryInfo =
+ NetworkUtility.shouldRetryException(
+ request, exception, requestStartMs, httpResponse, responseContents);
+ // RetryPolicy#retry may need a background thread, so invoke in the blocking executor.
+ getBlockingExecutor()
+ .execute(new InvokeRetryPolicyTask<>(request, retryInfo, callback));
} catch (VolleyError volleyError) {
callback.onError(volleyError);
- return;
}
- performRequest(request, callback);
+ }
+
+ private class InvokeRetryPolicyTask<T> extends RequestTask<T> {
+ final Request<T> request;
+ final RetryInfo retryInfo;
+ final OnRequestComplete callback;
+
+ InvokeRetryPolicyTask(Request<T> request, RetryInfo retryInfo, OnRequestComplete callback) {
+ super(request);
+ this.request = request;
+ this.retryInfo = retryInfo;
+ this.callback = callback;
+ }
+
+ @Override
+ public void run() {
+ try {
+ NetworkUtility.attemptRetryOnException(request, retryInfo);
+ // attemptRetryOnException didn't throw, so proceed with the next attempt.
+ performRequest(request, callback);
+ } catch (VolleyError e) {
+ callback.onError(e);
+ }
+ }
}
@Override
diff --git a/src/main/java/com/android/volley/toolbox/BasicNetwork.java b/core/src/main/java/com/android/volley/toolbox/BasicNetwork.java
index 06427fe..552e628 100644
--- a/src/main/java/com/android/volley/toolbox/BasicNetwork.java
+++ b/core/src/main/java/com/android/volley/toolbox/BasicNetwork.java
@@ -22,6 +22,7 @@ import com.android.volley.Network;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.VolleyError;
+import com.android.volley.toolbox.NetworkUtility.RetryInfo;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
@@ -140,8 +141,11 @@ public class BasicNetwork implements Network {
} catch (IOException e) {
// This will either throw an exception, breaking us from the loop, or will loop
// again and retry the request.
- NetworkUtility.handleException(
- request, e, requestStart, httpResponse, responseContents);
+ RetryInfo retryInfo =
+ NetworkUtility.shouldRetryException(
+ request, e, requestStart, httpResponse, responseContents);
+ // We should already be on a background thread, so we can invoke the retry inline.
+ NetworkUtility.attemptRetryOnException(request, retryInfo);
}
}
}
diff --git a/src/main/java/com/android/volley/toolbox/ByteArrayPool.java b/core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java
index 0134fa2..0134fa2 100644
--- a/src/main/java/com/android/volley/toolbox/ByteArrayPool.java
+++ b/core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java
diff --git a/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java b/core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java
index 856ef80..856ef80 100644
--- a/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java
diff --git a/src/main/java/com/android/volley/toolbox/DiskBasedCache.java b/core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java
index d4310e0..d4310e0 100644
--- a/src/main/java/com/android/volley/toolbox/DiskBasedCache.java
+++ b/core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java
diff --git a/src/main/java/com/android/volley/toolbox/FileSupplier.java b/core/src/main/java/com/android/volley/toolbox/FileSupplier.java
index 70898a6..70898a6 100644
--- a/src/main/java/com/android/volley/toolbox/FileSupplier.java
+++ b/core/src/main/java/com/android/volley/toolbox/FileSupplier.java
diff --git a/src/main/java/com/android/volley/toolbox/HttpClientStack.java b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
index 1e9e4b0..1e9e4b0 100644
--- a/src/main/java/com/android/volley/toolbox/HttpClientStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java
diff --git a/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java b/core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java
index 0b29e80..0b29e80 100644
--- a/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java
+++ b/core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java
diff --git a/src/main/java/com/android/volley/toolbox/HttpResponse.java b/core/src/main/java/com/android/volley/toolbox/HttpResponse.java
index 595f926..595f926 100644
--- a/src/main/java/com/android/volley/toolbox/HttpResponse.java
+++ b/core/src/main/java/com/android/volley/toolbox/HttpResponse.java
diff --git a/src/main/java/com/android/volley/toolbox/HttpStack.java b/core/src/main/java/com/android/volley/toolbox/HttpStack.java
index 85179a7..85179a7 100644
--- a/src/main/java/com/android/volley/toolbox/HttpStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/HttpStack.java
diff --git a/src/main/java/com/android/volley/toolbox/HurlStack.java b/core/src/main/java/com/android/volley/toolbox/HurlStack.java
index 35c6a72..35c6a72 100644
--- a/src/main/java/com/android/volley/toolbox/HurlStack.java
+++ b/core/src/main/java/com/android/volley/toolbox/HurlStack.java
diff --git a/src/main/java/com/android/volley/toolbox/ImageLoader.java b/core/src/main/java/com/android/volley/toolbox/ImageLoader.java
index eece2cf..eece2cf 100644
--- a/src/main/java/com/android/volley/toolbox/ImageLoader.java
+++ b/core/src/main/java/com/android/volley/toolbox/ImageLoader.java
diff --git a/src/main/java/com/android/volley/toolbox/ImageRequest.java b/core/src/main/java/com/android/volley/toolbox/ImageRequest.java
index 32b5aa3..32b5aa3 100644
--- a/src/main/java/com/android/volley/toolbox/ImageRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/ImageRequest.java
diff --git a/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java
index 86ed9e9..9f56746 100644
--- a/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java
@@ -26,7 +26,10 @@ import java.io.UnsupportedEncodingException;
import org.json.JSONArray;
import org.json.JSONException;
-/** A request for retrieving a {@link JSONArray} response body at a given URL. */
+/**
+ * A request for retrieving a {@link JSONArray} response body at a given URL, allowing for an
+ * optional {@link JSONArray} to be passed in as part of the request body.
+ */
public class JsonArrayRequest extends JsonRequest<JSONArray> {
/**
@@ -60,7 +63,7 @@ public class JsonArrayRequest extends JsonRequest<JSONArray> {
super(
method,
url,
- (jsonRequest == null) ? null : jsonRequest.toString(),
+ jsonRequest != null ? jsonRequest.toString() : null,
listener,
errorListener);
}
diff --git a/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java
index 8dca0ec..eccb54b 100644
--- a/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java
@@ -35,42 +35,55 @@ public class JsonObjectRequest extends JsonRequest<JSONObject> {
/**
* Creates a new request.
*
- * @param method the HTTP method to use
* @param url URL to fetch the JSON from
- * @param jsonRequest A {@link JSONObject} to post with the request. Null indicates no
- * parameters will be posted along with request.
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
*/
public JsonObjectRequest(
- int method,
+ String url, Listener<JSONObject> listener, @Nullable ErrorListener errorListener) {
+ super(Method.GET, url, null, listener, errorListener);
+ }
+
+ /**
+ * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is <code>null
+ * </code> , <code>POST</code> otherwise.
+ *
+ * @deprecated Use {@link #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)}.
+ */
+ @Deprecated
+ public JsonObjectRequest(
String url,
@Nullable JSONObject jsonRequest,
Listener<JSONObject> listener,
@Nullable ErrorListener errorListener) {
super(
- method,
+ jsonRequest == null ? Method.GET : Method.POST,
url,
- (jsonRequest == null) ? null : jsonRequest.toString(),
+ jsonRequest != null ? jsonRequest.toString() : null,
listener,
errorListener);
}
/**
- * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is <code>null
- * </code> , <code>POST</code> otherwise.
+ * Creates a new request.
*
- * @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)
+ * @param method the HTTP method to use
+ * @param url URL to fetch the JSON from
+ * @param jsonRequest A {@link JSONObject} to post with the request. Null indicates no
+ * parameters will be posted along with request.
+ * @param listener Listener to receive the JSON response
+ * @param errorListener Error listener, or null to ignore errors.
*/
public JsonObjectRequest(
+ int method,
String url,
@Nullable JSONObject jsonRequest,
Listener<JSONObject> listener,
@Nullable ErrorListener errorListener) {
- this(
- jsonRequest == null ? Method.GET : Method.POST,
+ super(
+ method,
url,
- jsonRequest,
+ jsonRequest != null ? jsonRequest.toString() : null,
listener,
errorListener);
}
diff --git a/src/main/java/com/android/volley/toolbox/JsonRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonRequest.java
index bc035ae..c2d1fad 100644
--- a/src/main/java/com/android/volley/toolbox/JsonRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/JsonRequest.java
@@ -61,6 +61,16 @@ public abstract class JsonRequest<T> extends Request<T> {
this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener);
}
+ /**
+ * Creates a new request.
+ *
+ * @param method the HTTP method to use
+ * @param url URL to fetch the JSON from
+ * @param requestBody The content to post as the body of the request. Null indicates no
+ * parameters will be posted along with request.
+ * @param listener Listener to receive the JSON response
+ * @param errorListener Error listener, or null to ignore errors.
+ */
public JsonRequest(
int method,
String url,
diff --git a/src/main/java/com/android/volley/toolbox/NetworkImageView.java b/core/src/main/java/com/android/volley/toolbox/NetworkImageView.java
index a24b3e2..a24b3e2 100644
--- a/src/main/java/com/android/volley/toolbox/NetworkImageView.java
+++ b/core/src/main/java/com/android/volley/toolbox/NetworkImageView.java
diff --git a/src/main/java/com/android/volley/toolbox/NetworkUtility.java b/core/src/main/java/com/android/volley/toolbox/NetworkUtility.java
index 44d5904..58a3bb3 100644
--- a/src/main/java/com/android/volley/toolbox/NetworkUtility.java
+++ b/core/src/main/java/com/android/volley/toolbox/NetworkUtility.java
@@ -42,7 +42,7 @@ import java.util.List;
* Utility class for methods that are shared between {@link BasicNetwork} and {@link
* BasicAsyncNetwork}
*/
-public final class NetworkUtility {
+final class NetworkUtility {
private static final int SLOW_REQUEST_THRESHOLD_MS = 3000;
private NetworkUtility() {}
@@ -113,30 +113,45 @@ public final class NetworkUtility {
/**
* Attempts to prepare the request for a retry. If there are no more attempts remaining in the
- * request's retry policy, a timeout exception is thrown.
+ * request's retry policy, the provided exception is thrown.
+ *
+ * <p>Must be invoked from a background thread, as client implementations of RetryPolicy#retry
+ * may make blocking calls.
*
* @param request The request to use.
*/
- private static void attemptRetryOnException(
- final String logPrefix, final Request<?> request, final VolleyError exception)
+ static void attemptRetryOnException(final Request<?> request, final RetryInfo retryInfo)
throws VolleyError {
final RetryPolicy retryPolicy = request.getRetryPolicy();
final int oldTimeout = request.getTimeoutMs();
try {
- retryPolicy.retry(exception);
+ retryPolicy.retry(retryInfo.errorToRetry);
} catch (VolleyError e) {
request.addMarker(
- String.format("%s-timeout-giveup [timeout=%s]", logPrefix, oldTimeout));
+ String.format(
+ "%s-timeout-giveup [timeout=%s]", retryInfo.logPrefix, oldTimeout));
throw e;
}
- request.addMarker(String.format("%s-retry [timeout=%s]", logPrefix, oldTimeout));
+ request.addMarker(String.format("%s-retry [timeout=%s]", retryInfo.logPrefix, oldTimeout));
+ }
+
+ static class RetryInfo {
+ private final String logPrefix;
+ private final VolleyError errorToRetry;
+
+ private RetryInfo(String logPrefix, VolleyError errorToRetry) {
+ this.logPrefix = logPrefix;
+ this.errorToRetry = errorToRetry;
+ }
}
/**
* Based on the exception thrown, decides whether to attempt to retry, or to throw the error.
- * Also handles logging.
+ *
+ * <p>If this method returns without throwing, {@link #attemptRetryOnException} should be called
+ * with the provided {@link RetryInfo} to consult the client's retry policy.
*/
- static void handleException(
+ static RetryInfo shouldRetryException(
Request<?> request,
IOException exception,
long requestStartMs,
@@ -144,7 +159,7 @@ public final class NetworkUtility {
@Nullable byte[] responseContents)
throws VolleyError {
if (exception instanceof SocketTimeoutException) {
- attemptRetryOnException("socket", request, new TimeoutError());
+ return new RetryInfo("socket", new TimeoutError());
} else if (exception instanceof MalformedURLException) {
throw new RuntimeException("Bad URL " + request.getUrl(), exception);
} else {
@@ -153,11 +168,9 @@ public final class NetworkUtility {
statusCode = httpResponse.getStatusCode();
} else {
if (request.shouldRetryConnectionErrors()) {
- attemptRetryOnException("connection", request, new NoConnectionError());
- return;
- } else {
- throw new NoConnectionError(exception);
+ return new RetryInfo("connection", new NoConnectionError());
}
+ throw new NoConnectionError(exception);
}
VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
NetworkResponse networkResponse;
@@ -173,24 +186,21 @@ public final class NetworkUtility {
responseHeaders);
if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED
|| statusCode == HttpURLConnection.HTTP_FORBIDDEN) {
- attemptRetryOnException("auth", request, new AuthFailureError(networkResponse));
- } else if (statusCode >= 400 && statusCode <= 499) {
+ return new RetryInfo("auth", new AuthFailureError(networkResponse));
+ }
+ if (statusCode >= 400 && statusCode <= 499) {
// Don't retry other client errors.
throw new ClientError(networkResponse);
- } else if (statusCode >= 500 && statusCode <= 599) {
+ }
+ if (statusCode >= 500 && statusCode <= 599) {
if (request.shouldRetryServerErrors()) {
- attemptRetryOnException(
- "server", request, new ServerError(networkResponse));
- } else {
- throw new ServerError(networkResponse);
+ return new RetryInfo("server", new ServerError(networkResponse));
}
- } else {
- // 3xx? No reason to retry.
- throw new ServerError(networkResponse);
}
- } else {
- attemptRetryOnException("network", request, new NetworkError());
+ // Server error and client has opted out of retries, or 3xx. No reason to retry.
+ throw new ServerError(networkResponse);
}
+ return new RetryInfo("network", new NetworkError());
}
}
}
diff --git a/src/main/java/com/android/volley/toolbox/NoAsyncCache.java b/core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java
index aa4aeea..1fda58f 100644
--- a/src/main/java/com/android/volley/toolbox/NoAsyncCache.java
+++ b/core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java
@@ -3,7 +3,12 @@ package com.android.volley.toolbox;
import com.android.volley.AsyncCache;
import com.android.volley.Cache;
-/** An AsyncCache that doesn't cache anything. */
+/**
+ * An AsyncCache that doesn't cache anything.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
public class NoAsyncCache extends AsyncCache {
@Override
public void get(String key, OnGetCompleteCallback callback) {
diff --git a/src/main/java/com/android/volley/toolbox/NoCache.java b/core/src/main/java/com/android/volley/toolbox/NoCache.java
index 51f9945..51f9945 100644
--- a/src/main/java/com/android/volley/toolbox/NoCache.java
+++ b/core/src/main/java/com/android/volley/toolbox/NoCache.java
diff --git a/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java b/core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java
index bdcc45e..bdcc45e 100644
--- a/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java
+++ b/core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java
diff --git a/src/main/java/com/android/volley/toolbox/RequestFuture.java b/core/src/main/java/com/android/volley/toolbox/RequestFuture.java
index f9cbce2..f9cbce2 100644
--- a/src/main/java/com/android/volley/toolbox/RequestFuture.java
+++ b/core/src/main/java/com/android/volley/toolbox/RequestFuture.java
diff --git a/src/main/java/com/android/volley/toolbox/StringRequest.java b/core/src/main/java/com/android/volley/toolbox/StringRequest.java
index df7b386..df7b386 100644
--- a/src/main/java/com/android/volley/toolbox/StringRequest.java
+++ b/core/src/main/java/com/android/volley/toolbox/StringRequest.java
diff --git a/src/main/java/com/android/volley/toolbox/Threads.java b/core/src/main/java/com/android/volley/toolbox/Threads.java
index 66c3e41..66c3e41 100644
--- a/src/main/java/com/android/volley/toolbox/Threads.java
+++ b/core/src/main/java/com/android/volley/toolbox/Threads.java
diff --git a/src/main/java/com/android/volley/toolbox/UrlRewriter.java b/core/src/main/java/com/android/volley/toolbox/UrlRewriter.java
index 8bbb770..8bbb770 100644
--- a/src/main/java/com/android/volley/toolbox/UrlRewriter.java
+++ b/core/src/main/java/com/android/volley/toolbox/UrlRewriter.java
diff --git a/src/main/java/com/android/volley/toolbox/Volley.java b/core/src/main/java/com/android/volley/toolbox/Volley.java
index bc65c9c..6ab34bb 100644
--- a/src/main/java/com/android/volley/toolbox/Volley.java
+++ b/core/src/main/java/com/android/volley/toolbox/Volley.java
@@ -21,6 +21,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.http.AndroidHttpClient;
import android.os.Build;
+import androidx.annotation.NonNull;
import com.android.volley.Network;
import com.android.volley.RequestQueue;
import java.io.File;
@@ -37,6 +38,7 @@ public class Volley {
* @param stack A {@link BaseHttpStack} to use for the network, or null for default.
* @return A started {@link RequestQueue} instance.
*/
+ @NonNull
public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) {
BasicNetwork network;
if (stack == null) {
@@ -78,6 +80,7 @@ public class Volley {
*/
@Deprecated
@SuppressWarnings("deprecation")
+ @NonNull
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
if (stack == null) {
return newRequestQueue(context, (BaseHttpStack) null);
@@ -85,6 +88,7 @@ public class Volley {
return newRequestQueue(context, new BasicNetwork(stack));
}
+ @NonNull
private static RequestQueue newRequestQueue(Context context, Network network) {
final Context appContext = context.getApplicationContext();
// Use a lazy supplier for the cache directory so that newRequestQueue() can be called on
@@ -112,6 +116,7 @@ public class Volley {
* @param context A {@link Context} to use for creating the cache dir.
* @return A started {@link RequestQueue} instance.
*/
+ @NonNull
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, (BaseHttpStack) null);
}
diff --git a/src/test/java/com/android/volley/AsyncRequestQueueTest.java b/core/src/test/java/com/android/volley/AsyncRequestQueueTest.java
index 54ff0a1..aef4f01 100644
--- a/src/test/java/com/android/volley/AsyncRequestQueueTest.java
+++ b/core/src/test/java/com/android/volley/AsyncRequestQueueTest.java
@@ -16,6 +16,9 @@
package com.android.volley;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -23,6 +26,8 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
+import com.android.volley.AsyncCache.OnGetCompleteCallback;
+import com.android.volley.AsyncCache.OnWriteCompleteCallback;
import com.android.volley.mock.ShadowSystemClock;
import com.android.volley.toolbox.NoAsyncCache;
import com.android.volley.toolbox.StringRequest;
@@ -34,6 +39,7 @@ import java.util.concurrent.ScheduledExecutorService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@@ -45,37 +51,13 @@ public class AsyncRequestQueueTest {
@Mock private AsyncNetwork mMockNetwork;
@Mock private ScheduledExecutorService mMockScheduledExecutor;
+ private final ResponseDelivery mDelivery = new ImmediateResponseDelivery();
private AsyncRequestQueue queue;
@Before
public void setUp() throws Exception {
- ResponseDelivery mDelivery = new ImmediateResponseDelivery();
initMocks(this);
- queue =
- new AsyncRequestQueue.Builder(mMockNetwork)
- .setAsyncCache(new NoAsyncCache())
- .setResponseDelivery(mDelivery)
- .setExecutorFactory(
- new AsyncRequestQueue.ExecutorFactory() {
- @Override
- public ExecutorService createNonBlockingExecutor(
- BlockingQueue<Runnable> taskQueue) {
- return MoreExecutors.newDirectExecutorService();
- }
-
- @Override
- public ExecutorService createBlockingExecutor(
- BlockingQueue<Runnable> taskQueue) {
- return MoreExecutors.newDirectExecutorService();
- }
-
- @Override
- public ScheduledExecutorService
- createNonBlockingScheduledExecutor() {
- return mMockScheduledExecutor;
- }
- })
- .build();
+ queue = createRequestQueue(new NoAsyncCache());
}
@Test
@@ -161,4 +143,58 @@ public class AsyncRequestQueueTest {
verifyNoMoreInteractions(listener);
queue.stop();
}
+
+ @Test
+ public void requestsQueuedBeforeCacheInitialization_asyncCache() {
+ // Create a new queue with a mock cache in order to verify the initialization.
+ AsyncCache mockAsyncCache = mock(AsyncCache.class);
+ AsyncRequestQueue queue = createRequestQueue(mockAsyncCache);
+ queue.start();
+
+ ArgumentCaptor<OnWriteCompleteCallback> callbackCaptor =
+ ArgumentCaptor.forClass(OnWriteCompleteCallback.class);
+ verify(mockAsyncCache).initialize(callbackCaptor.capture());
+
+ StringRequest req = mock(StringRequest.class);
+ req.setShouldCache(true);
+ when(req.getCacheKey()).thenReturn("cache-key");
+ queue.add(req);
+
+ // Cache should not be read before initialization completes.
+ verify(mockAsyncCache, never()).get(anyString(), any(OnGetCompleteCallback.class));
+
+ callbackCaptor.getValue().onWriteComplete();
+
+ // Once the write completes, the request should be kicked off (in the form of a cache
+ // lookup).
+ verify(mockAsyncCache).get(eq("cache-key"), any(OnGetCompleteCallback.class));
+
+ queue.stop();
+ }
+
+ private AsyncRequestQueue createRequestQueue(AsyncCache asyncCache) {
+ return new AsyncRequestQueue.Builder(mMockNetwork)
+ .setResponseDelivery(mDelivery)
+ .setAsyncCache(asyncCache)
+ .setExecutorFactory(
+ new AsyncRequestQueue.ExecutorFactory() {
+ @Override
+ public ExecutorService createNonBlockingExecutor(
+ BlockingQueue<Runnable> taskQueue) {
+ return MoreExecutors.newDirectExecutorService();
+ }
+
+ @Override
+ public ExecutorService createBlockingExecutor(
+ BlockingQueue<Runnable> taskQueue) {
+ return MoreExecutors.newDirectExecutorService();
+ }
+
+ @Override
+ public ScheduledExecutorService createNonBlockingScheduledExecutor() {
+ return mMockScheduledExecutor;
+ }
+ })
+ .build();
+ }
}
diff --git a/src/test/java/com/android/volley/CacheDispatcherTest.java b/core/src/test/java/com/android/volley/CacheDispatcherTest.java
index aef6785..aef6785 100644
--- a/src/test/java/com/android/volley/CacheDispatcherTest.java
+++ b/core/src/test/java/com/android/volley/CacheDispatcherTest.java
diff --git a/src/test/java/com/android/volley/NetworkDispatcherTest.java b/core/src/test/java/com/android/volley/NetworkDispatcherTest.java
index 74dfe8a..74dfe8a 100644
--- a/src/test/java/com/android/volley/NetworkDispatcherTest.java
+++ b/core/src/test/java/com/android/volley/NetworkDispatcherTest.java
diff --git a/src/test/java/com/android/volley/NetworkResponseTest.java b/core/src/test/java/com/android/volley/NetworkResponseTest.java
index 70210da..70210da 100644
--- a/src/test/java/com/android/volley/NetworkResponseTest.java
+++ b/core/src/test/java/com/android/volley/NetworkResponseTest.java
diff --git a/src/test/java/com/android/volley/RequestQueueIntegrationTest.java b/core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java
index a2bfbc6..a2bfbc6 100644
--- a/src/test/java/com/android/volley/RequestQueueIntegrationTest.java
+++ b/core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java
diff --git a/src/test/java/com/android/volley/RequestQueueTest.java b/core/src/test/java/com/android/volley/RequestQueueTest.java
index ba9b0f8..ba9b0f8 100644
--- a/src/test/java/com/android/volley/RequestQueueTest.java
+++ b/core/src/test/java/com/android/volley/RequestQueueTest.java
diff --git a/src/test/java/com/android/volley/RequestTest.java b/core/src/test/java/com/android/volley/RequestTest.java
index cced39f..cced39f 100644
--- a/src/test/java/com/android/volley/RequestTest.java
+++ b/core/src/test/java/com/android/volley/RequestTest.java
diff --git a/src/test/java/com/android/volley/ResponseDeliveryTest.java b/core/src/test/java/com/android/volley/ResponseDeliveryTest.java
index 6e71c3b..6e71c3b 100644
--- a/src/test/java/com/android/volley/ResponseDeliveryTest.java
+++ b/core/src/test/java/com/android/volley/ResponseDeliveryTest.java
diff --git a/src/test/java/com/android/volley/mock/MockAsyncStack.java b/core/src/test/java/com/android/volley/mock/MockAsyncStack.java
index 5ea8343..5ea8343 100644
--- a/src/test/java/com/android/volley/mock/MockAsyncStack.java
+++ b/core/src/test/java/com/android/volley/mock/MockAsyncStack.java
diff --git a/src/test/java/com/android/volley/mock/MockHttpStack.java b/core/src/test/java/com/android/volley/mock/MockHttpStack.java
index b86e7a0..b86e7a0 100644
--- a/src/test/java/com/android/volley/mock/MockHttpStack.java
+++ b/core/src/test/java/com/android/volley/mock/MockHttpStack.java
diff --git a/src/test/java/com/android/volley/mock/MockRequest.java b/core/src/test/java/com/android/volley/mock/MockRequest.java
index 6fc26b4..6fc26b4 100644
--- a/src/test/java/com/android/volley/mock/MockRequest.java
+++ b/core/src/test/java/com/android/volley/mock/MockRequest.java
diff --git a/src/test/java/com/android/volley/mock/ShadowSystemClock.java b/core/src/test/java/com/android/volley/mock/ShadowSystemClock.java
index 6d75d4b..6d75d4b 100644
--- a/src/test/java/com/android/volley/mock/ShadowSystemClock.java
+++ b/core/src/test/java/com/android/volley/mock/ShadowSystemClock.java
diff --git a/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java b/core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java
index dbd6535..dbd6535 100644
--- a/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java
diff --git a/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java b/core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java
index 982eda2..982eda2 100644
--- a/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java
diff --git a/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java b/core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java
index 1049ad0..1049ad0 100644
--- a/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java
diff --git a/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java b/core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java
index 91d4062..91d4062 100644
--- a/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java
diff --git a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java b/core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
index 3630379..3630379 100644
--- a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java
diff --git a/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java b/core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java
index 62da207..62da207 100644
--- a/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java
diff --git a/src/test/java/com/android/volley/toolbox/CacheTest.java b/core/src/test/java/com/android/volley/toolbox/CacheTest.java
index 22dae22..22dae22 100644
--- a/src/test/java/com/android/volley/toolbox/CacheTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/CacheTest.java
diff --git a/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java b/core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java
index db6e491..db6e491 100644
--- a/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java
diff --git a/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java b/core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java
index 2a451dc..2a451dc 100644
--- a/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java
diff --git a/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java b/core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java
index 7780c3e..7780c3e 100644
--- a/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java
diff --git a/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java b/core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java
index 6794af8..6794af8 100644
--- a/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java
diff --git a/src/test/java/com/android/volley/toolbox/HurlStackTest.java b/core/src/test/java/com/android/volley/toolbox/HurlStackTest.java
index 7508244..7508244 100644
--- a/src/test/java/com/android/volley/toolbox/HurlStackTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/HurlStackTest.java
diff --git a/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java b/core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java
index 59a0b1b..59a0b1b 100644
--- a/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java
diff --git a/src/test/java/com/android/volley/toolbox/ImageRequestTest.java b/core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java
index 6b50319..6b50319 100644
--- a/src/test/java/com/android/volley/toolbox/ImageRequestTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java
diff --git a/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java b/core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java
index 70bb2ea..70bb2ea 100644
--- a/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java
diff --git a/src/test/java/com/android/volley/toolbox/JsonRequestTest.java b/core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java
index 44c0ad9..44c0ad9 100644
--- a/src/test/java/com/android/volley/toolbox/JsonRequestTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java
diff --git a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java b/core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
index fd2073e..fd2073e 100644
--- a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
diff --git a/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java b/core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java
index 266edcd..266edcd 100644
--- a/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java
diff --git a/src/test/java/com/android/volley/toolbox/RequestFutureTest.java b/core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java
index 5b5c975..5b5c975 100644
--- a/src/test/java/com/android/volley/toolbox/RequestFutureTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java
diff --git a/src/test/java/com/android/volley/toolbox/RequestQueueTest.java b/core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java
index 1899b71..1899b71 100644
--- a/src/test/java/com/android/volley/toolbox/RequestQueueTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java
diff --git a/src/test/java/com/android/volley/toolbox/RequestTest.java b/core/src/test/java/com/android/volley/toolbox/RequestTest.java
index 0911ad6..0911ad6 100644
--- a/src/test/java/com/android/volley/toolbox/RequestTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/RequestTest.java
diff --git a/src/test/java/com/android/volley/toolbox/ResponseTest.java b/core/src/test/java/com/android/volley/toolbox/ResponseTest.java
index 44438fa..44438fa 100644
--- a/src/test/java/com/android/volley/toolbox/ResponseTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/ResponseTest.java
diff --git a/src/test/java/com/android/volley/toolbox/StringRequestTest.java b/core/src/test/java/com/android/volley/toolbox/StringRequestTest.java
index 0ecb06b..0ecb06b 100644
--- a/src/test/java/com/android/volley/toolbox/StringRequestTest.java
+++ b/core/src/test/java/com/android/volley/toolbox/StringRequestTest.java
diff --git a/src/test/java/com/android/volley/utils/CacheTestUtils.java b/core/src/test/java/com/android/volley/utils/CacheTestUtils.java
index 5980712..5980712 100644
--- a/src/test/java/com/android/volley/utils/CacheTestUtils.java
+++ b/core/src/test/java/com/android/volley/utils/CacheTestUtils.java
diff --git a/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java b/core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java
index 67e5923..67e5923 100644
--- a/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java
+++ b/core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java
diff --git a/src/test/resources/org.robolectric.Config.properties b/core/src/test/resources/org.robolectric.Config.properties
index 9daf692..9daf692 100644
--- a/src/test/resources/org.robolectric.Config.properties
+++ b/core/src/test/resources/org.robolectric.Config.properties
diff --git a/cronet/build.gradle b/cronet/build.gradle
new file mode 100644
index 0000000..5ee53d6
--- /dev/null
+++ b/cronet/build.gradle
@@ -0,0 +1,24 @@
+dependencies {
+ implementation project(":core")
+ implementation "androidx.annotation:annotation:1.0.1"
+ compileOnly "org.chromium.net:cronet-embedded:76.3809.111"
+
+ testImplementation project(":testing")
+ testImplementation "org.chromium.net:cronet-embedded:76.3809.111"
+ testImplementation "junit:junit:4.12"
+ testImplementation "org.mockito:mockito-core:2.19.0"
+ testImplementation "org.robolectric:robolectric:3.4.2"
+}
+
+publishing {
+ publications {
+ library(MavenPublication) {
+ artifactId 'volley-cronet'
+ pom {
+ name = 'Volley Cronet'
+ description = 'Cronet support for Volley.'
+ }
+ artifact "$buildDir/outputs/aar/cronet-release.aar"
+ }
+ }
+}
diff --git a/cronet/src/main/AndroidManifest.xml b/cronet/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0dec093
--- /dev/null
+++ b/cronet/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="com.android.volley.cronet" />
diff --git a/src/main/java/com/android/volley/cronet/CronetHttpStack.java b/cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java
index f3baace..874029b 100644
--- a/src/main/java/com/android/volley/cronet/CronetHttpStack.java
+++ b/cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java
@@ -53,6 +53,9 @@ import org.chromium.net.UrlResponseInfo;
/**
* A {@link AsyncHttpStack} that's based on Cronet's fully asynchronous API for network requests.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
*/
public class CronetHttpStack extends AsyncHttpStack {
diff --git a/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java b/cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java
index cedb6ff..cedb6ff 100644
--- a/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java
+++ b/cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java
diff --git a/publish-snapshot-on-commit.sh b/publish-snapshot-on-commit.sh
index 0d0e034..ba02b79 100755
--- a/publish-snapshot-on-commit.sh
+++ b/publish-snapshot-on-commit.sh
@@ -1,13 +1,15 @@
set -eu
-if [ "$TRAVIS_REPO_SLUG" == "google/volley" ] && \
- [ "$TRAVIS_PULL_REQUEST" == "false" ] && \
- [ "$TRAVIS_BRANCH" == "master" ]; then
- echo -e "Publishing snapshot build to OJO...\n"
+GITHUB_BRANCH=${GITHUB_REF#refs/heads/}
- ./gradlew artifactoryPublish
+if [ "$GITHUB_REPOSITORY" == "google/volley" ] && \
+ [ "$GITHUB_EVENT_NAME" == "push" ] && \
+ [ "$GITHUB_BRANCH" == "master" ]; then
+ echo -e "Publishing snapshot build...\n"
- echo -e "Published snapshot build to OJO"
+ ./gradlew publish
+
+ echo -e "Published snapshot build"
else
echo -e "Not publishing snapshot"
-fi \ No newline at end of file
+fi
diff --git a/publish.gradle b/publish.gradle
new file mode 100644
index 0000000..429df4d
--- /dev/null
+++ b/publish.gradle
@@ -0,0 +1,72 @@
+apply plugin: 'maven-publish'
+
+task sourcesJar(type: Jar) {
+ classifier = 'sources'
+ from android.sourceSets.main.java.srcDirs
+}
+
+task javadoc(type: Javadoc) {
+ source = android.sourceSets.main.java.srcDirs
+ classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
+}
+
+afterEvaluate {
+ javadoc.classpath += files(android.libraryVariants.collect { variant ->
+ variant.getJavaCompile().classpath.files
+ })
+}
+
+task javadocJar(type: Jar, dependsOn: javadoc) {
+ classifier = 'javadoc'
+ from javadoc.destinationDir
+}
+
+artifacts {
+ archives javadocJar
+ archives sourcesJar
+}
+
+publishing {
+ publications {
+ library(MavenPublication) {
+ groupId 'com.android.volley'
+ version project.version
+ pom {
+ name = 'Volley'
+ url = 'https://github.com/google/volley'
+ packaging 'aar'
+ licenses {
+ license {
+ name = "The Apache License, Version 2.0"
+ url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
+ }
+ }
+ scm {
+ connection = 'scm:git:git://github.com/google/volley.git'
+ developerConnection = 'scm:git:ssh://git@github.com/google/volley.git'
+ url = 'https://github.com/google/volley'
+ }
+ developers {
+ developer {
+ name = 'The Volley Team'
+ email = 'noreply+volley@google.com'
+ }
+ }
+ }
+
+ // Release AAR, Sources, and JavaDoc
+ artifact sourcesJar
+ artifact javadocJar
+ }
+ }
+
+ repositories {
+ maven {
+ url = "https://oss.sonatype.org/content/repositories/snapshots/"
+ credentials {
+ username = System.env.OSSRH_DEPLOY_USERNAME
+ password = System.env.OSSRH_DEPLOY_PASSWORD
+ }
+ }
+ }
+}
diff --git a/rules.gradle b/rules.gradle
deleted file mode 100644
index e0aef80..0000000
--- a/rules.gradle
+++ /dev/null
@@ -1,36 +0,0 @@
-// See build.gradle for an explanation of what this file is.
-
-apply plugin: 'com.android.library'
-
-android {
- useLibrary 'org.apache.http.legacy'
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
-
- defaultConfig {
- consumerProguardFiles 'consumer-proguard-rules.pro'
- }
-}
-
-tasks.withType(JavaCompile) {
- options.compilerArgs << "-Xlint:unchecked" << "-Werror"
-}
-
-dependencies {
- implementation "androidx.annotation:annotation:1.0.1"
- compileOnly "org.chromium.net:cronet-embedded:76.3809.111"
-}
-
-// Check if the android plugin version supports unit testing.
-if (configurations.findByName("testImplementation")) {
- dependencies {
- testImplementation "org.chromium.net:cronet-embedded:76.3809.111"
- testImplementation "junit:junit:4.12"
- testImplementation "org.hamcrest:hamcrest-library:1.3"
- testImplementation "org.mockito:mockito-core:2.19.0"
- testImplementation "org.robolectric:robolectric:3.4.2"
- }
-}
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..ace4000
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,4 @@
+rootProject.name = 'volley'
+include 'core'
+include 'cronet'
+include 'testing'
diff --git a/testing/build.gradle b/testing/build.gradle
new file mode 100644
index 0000000..b374088
--- /dev/null
+++ b/testing/build.gradle
@@ -0,0 +1,4 @@
+dependencies {
+ implementation project(":core")
+}
+
diff --git a/testing/src/main/AndroidManifest.xml b/testing/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..24b1376
--- /dev/null
+++ b/testing/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="com.android.volley.testing" />
diff --git a/src/test/java/com/android/volley/mock/TestRequest.java b/testing/src/main/java/com/android/volley/mock/TestRequest.java
index f397f01..f397f01 100644
--- a/src/test/java/com/android/volley/mock/TestRequest.java
+++ b/testing/src/main/java/com/android/volley/mock/TestRequest.java